You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/03/20 15:22:53 UTC

[39/51] [abbrv] [partial] incubator-taverna-workbench git commit: taverna-workbench-* -> taverna-*

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context-osgi.xml b/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context-osgi.xml
new file mode 100644
index 0000000..f595eda
--- /dev/null
+++ b/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context-osgi.xml
@@ -0,0 +1,37 @@
+<?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="askUserMasterPasswordProvider" interface="net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider" />
+
+	<service ref="simpleMasterPasswordProvider" interface="net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider" />
+
+	<service ref="askUserJavaTruststorePasswordProvider" interface="net.sf.taverna.t2.security.credentialmanager.JavaTruststorePasswordProvider" />
+
+	<service ref="askUserServiceUsernameAndPasswordProvider" interface="net.sf.taverna.t2.security.credentialmanager.ServiceUsernameAndPasswordProvider" />
+
+	<service ref="askUserTrustConfirmationProvider" interface="net.sf.taverna.t2.security.credentialmanager.TrustConfirmationProvider" />
+
+	<service ref="UIUsernamePasswordProvider" auto-export="interfaces" />
+        
+	<service ref="UIMasterPasswordProvider" auto-export="interfaces" />
+	
+        <service ref="ConfirmTrustedCertificateUI" auto-export="interfaces" />
+
+	<service ref="InitialiseSSLStartupHook" interface="net.sf.taverna.t2.workbench.StartupSPI" />
+	
+        <service ref="SetCredManAuthenticatorStartupHook" interface="net.sf.taverna.t2.workbench.StartupSPI" />
+
+	<service ref="CredentialManagerMenu" auto-export="interfaces" />
+
+	<reference id="CredentialManager" interface="net.sf.taverna.t2.security.credentialmanager.CredentialManager" />
+	
+        <reference id="distinguishedNameParser" interface="net.sf.taverna.t2.security.credentialmanager.DistinguishedNameParser" />
+	
+        <reference id="ApplicationConfiguration" interface="uk.org.taverna.configuration.app.ApplicationConfiguration" />
+
+</beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context.xml
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context.xml b/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context.xml
new file mode 100644
index 0000000..0e54c93
--- /dev/null
+++ b/taverna-credential-manager-ui/src/main/resources/META-INF/spring/credential-manager-ui-context.xml
@@ -0,0 +1,44 @@
+<?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="askUserMasterPasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.AskUserMasterPasswordProvider" />
+
+	<bean id="simpleMasterPasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.SimpleMasterPasswordProvider" />
+
+	<bean id="askUserJavaTruststorePasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.AskUserJavaTruststorePasswordProvider" />
+
+	<bean id="askUserServiceUsernameAndPasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.AskUserServiceUsernameAndPasswordProvider" />
+
+	<bean id="askUserTrustConfirmationProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.AskUserTrustConfirmationProvider" />
+
+	<bean id="MasterPasswordProviderComparator" class="net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider$ProviderComparator" />
+
+	<bean id="UIUsernamePasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.UIUsernamePasswordProvider" >
+                <property name="distinguishedNameParser" ref="distinguishedNameParser" />
+	</bean>            
+	
+        <bean id="UIMasterPasswordProvider" class="net.sf.taverna.t2.workbench.ui.credentialmanager.password.UIMasterPasswordProvider">
+		<property name="applicationConfiguration" ref="ApplicationConfiguration" />
+                <property name="distinguishedNameParser" ref="distinguishedNameParser" />
+	</bean>
+	
+        <bean id="ConfirmTrustedCertificateUI" class="net.sf.taverna.t2.workbench.ui.credentialmanager.ConfirmTrustedCertificateUI">
+                <property name="distinguishedNameParser" ref="distinguishedNameParser" />
+	</bean>            
+	
+        <bean id="InitialiseSSLStartupHook" class="net.sf.taverna.t2.workbench.ui.credentialmanager.startup.InitialiseSSLStartupHook">
+		<property name="credentialManager" ref="CredentialManager" />
+	</bean>
+	
+        <bean id="SetCredManAuthenticatorStartupHook" class="net.sf.taverna.t2.workbench.ui.credentialmanager.startup.SetCredManAuthenticatorStartupHook" >
+		<property name="credentialManager" ref="CredentialManager" />
+	</bean>
+
+	<bean id="CredentialManagerMenu" class="net.sf.taverna.t2.workbench.ui.credentialmanager.menu.CredentialManagerMenu" >
+		<property name="credentialManager" ref="CredentialManager" />
+                <property name="distinguishedNameParser" ref="distinguishedNameParser" />
+	</bean>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/cred_manager.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/cred_manager.png b/taverna-credential-manager-ui/src/main/resources/images/cred_manager.png
new file mode 100644
index 0000000..48cd63c
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/cred_manager.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/cred_manager16x16.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/cred_manager16x16.png b/taverna-credential-manager-ui/src/main/resources/images/cred_manager16x16.png
new file mode 100644
index 0000000..c6e73b5
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/cred_manager16x16.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/cred_manager_transparent.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/cred_manager_transparent.png b/taverna-credential-manager-ui/src/main/resources/images/cred_manager_transparent.png
new file mode 100644
index 0000000..1e89bde
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/cred_manager_transparent.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/table/entry_heading.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/table/entry_heading.png b/taverna-credential-manager-ui/src/main/resources/images/table/entry_heading.png
new file mode 100644
index 0000000..8b59845
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/table/entry_heading.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/table/key_entry.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/table/key_entry.png b/taverna-credential-manager-ui/src/main/resources/images/table/key_entry.png
new file mode 100644
index 0000000..1fd18c6
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/table/key_entry.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/table/keypair_entry.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/table/keypair_entry.png b/taverna-credential-manager-ui/src/main/resources/images/table/keypair_entry.png
new file mode 100644
index 0000000..8fd3e8b
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/table/keypair_entry.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-credential-manager-ui/src/main/resources/images/table/trustcert_entry.png
----------------------------------------------------------------------
diff --git a/taverna-credential-manager-ui/src/main/resources/images/table/trustcert_entry.png b/taverna-credential-manager-ui/src/main/resources/images/table/trustcert_entry.png
new file mode 100644
index 0000000..0f110e1
Binary files /dev/null and b/taverna-credential-manager-ui/src/main/resources/images/table/trustcert_entry.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/pom.xml b/taverna-data-management-config-ui/pom.xml
new file mode 100644
index 0000000..f044b8a
--- /dev/null
+++ b/taverna-data-management-config-ui/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<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.workbench</groupId>
+		<artifactId>taverna-workbench</artifactId>
+		<version>3.1.0-incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-data-management-config-ui</artifactId>
+	<packaging>bundle</packaging>
+	<name>Apache Taverna Data management configuration UI</name>
+	<dependencies>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-ui</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-helper-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<!--<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-run-ui</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		-->
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-configuration-api</artifactId>
+			<version>${taverna.osgi.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.springframework</groupId>
+			<artifactId>spring-aop</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjrt</artifactId>
+			<version>${aspectj.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjweaver</artifactId>
+			<version>${aspectj.version}</version>
+		</dependency> -->
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationPanel.java
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationPanel.java b/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationPanel.java
new file mode 100644
index 0000000..b705362
--- /dev/null
+++ b/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationPanel.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * 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.workbench.reference.config;
+
+import static java.awt.Color.RED;
+import static java.awt.Font.PLAIN;
+import static java.awt.GridBagConstraints.BOTH;
+import static java.awt.GridBagConstraints.HORIZONTAL;
+import static java.awt.GridBagConstraints.NONE;
+import static java.awt.GridBagConstraints.RELATIVE;
+import static java.awt.GridBagConstraints.WEST;
+import static net.sf.taverna.t2.workbench.helper.Helper.showHelp;
+
+import java.awt.Font;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.sql.Connection;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.border.EmptyBorder;
+
+import net.sf.taverna.t2.lang.ui.DialogTextArea;
+import uk.org.taverna.configuration.database.DatabaseConfiguration;
+import uk.org.taverna.configuration.database.DatabaseManager;
+
+@SuppressWarnings("serial")
+public class DataManagementConfigurationPanel extends JPanel {
+	private DatabaseConfiguration configuration;
+	private DatabaseManager databaseManager;
+
+	private JCheckBox enableProvenance;
+	private JCheckBox enableInMemory;
+	private JButton helpButton;
+	private JButton resetButton;
+	private JButton applyButton;
+	private JTextArea storageText;
+	private JTextArea exposeDatanatureText;
+	private JCheckBox exposeDatanatureBox;
+	private DialogTextArea enableInMemoryTextDisabled;
+
+	public DataManagementConfigurationPanel(DatabaseConfiguration configuration, DatabaseManager databaseManager) {
+		this.configuration = configuration;
+		this.databaseManager = databaseManager;
+
+		setLayout(generateLayout());
+		resetFields();
+	}
+
+	private static final boolean ADD_WARNING_LISTENERS = false;
+
+	private GridBagLayout generateLayout() {
+		GridBagLayout gridbag = new GridBagLayout();
+		GridBagConstraints c = new GridBagConstraints();
+
+		enableProvenance = new JCheckBox("Enable provenance capture");
+		DialogTextArea enableProvenanceText = new DialogTextArea(
+				"Disabling provenance will prevent you from being able to view intermediate results, but does give a performance benefit.");
+		Font plain = enableProvenanceText.getFont().deriveFont(PLAIN, 11);
+		enableProvenanceText.setLineWrap(true);
+		enableProvenanceText.setWrapStyleWord(true);
+		enableProvenanceText.setEditable(false);
+		enableProvenanceText.setFocusable(false);
+		enableProvenanceText.setOpaque(false);
+		enableProvenanceText.setFont(plain);
+
+		enableInMemory = new JCheckBox("In-memory storage");
+		DialogTextArea enableInMemoryText = new DialogTextArea(
+				"Data will not be stored between workbench sessions. If you run workflows passing larger amounts of data, try disabling in-memory storage, which can reduce execution performance, but also Taverna's memory consumption. ");
+		enableInMemoryText.setLineWrap(true);
+		enableInMemoryText.setWrapStyleWord(true);
+		enableInMemoryText.setEditable(false);
+		enableInMemoryText.setFocusable(false);
+		enableInMemoryText.setOpaque(false);
+		enableInMemoryText.setFont(plain);
+
+		enableInMemoryTextDisabled = new DialogTextArea(
+				"If you enable in-memory storage of data when provenance collection is turned on then provenance will not be available after you shutdown Taverna as the in-memory data will be lost.");
+		enableInMemoryTextDisabled.setLineWrap(true);
+		enableInMemoryTextDisabled.setWrapStyleWord(true);
+		enableInMemoryTextDisabled.setEditable(false);
+		enableInMemoryTextDisabled.setFocusable(false);
+		enableInMemoryTextDisabled.setOpaque(false);
+		enableInMemoryTextDisabled.setFont(plain);
+		enableInMemoryTextDisabled.setForeground(RED);
+		enableInMemoryTextDisabled.setVisible(false);
+
+		// Disable warning as inMemory is default
+		// To re-enable - also see resetFields()
+
+		if (ADD_WARNING_LISTENERS) {
+			enableInMemory.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					enableInMemoryTextDisabled.setVisible(enableProvenance
+							.isSelected() && enableInMemory.isSelected());
+				}
+			});
+			enableProvenance.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					enableInMemoryTextDisabled.setVisible(enableProvenance
+							.isSelected() && enableInMemory.isSelected());
+				}
+			});
+		}
+
+		storageText = new JTextArea(
+				"Select how Taverna stores the data and provenance produced when a workflow is run. This includes workflow results and intermediate results.");
+		storageText.setLineWrap(true);
+		storageText.setWrapStyleWord(true);
+		storageText.setEditable(false);
+		storageText.setFocusable(false);
+		storageText.setBorder(new EmptyBorder(10, 10, 10, 10));
+		storageText.setFont(plain);
+
+		JComponent portPanel = createDerbyServerStatusComponent();
+
+		c.anchor = WEST;
+		c.insets = new Insets(0, 0, 10, 0);
+		c.gridx = 0;
+		c.gridy = RELATIVE;
+		c.weightx = 0.0;
+		c.weighty = 0.0;
+		c.fill = HORIZONTAL;
+		gridbag.setConstraints(storageText, c);
+		add(storageText);
+
+		c.ipady = 0;
+		c.insets = new Insets(0, 0, 5, 0);
+		c.fill = NONE;
+		gridbag.setConstraints(enableProvenance, c);
+		add(enableProvenance);
+
+		c.insets = new Insets(0, 20, 15, 20);
+		c.fill = HORIZONTAL;
+		gridbag.setConstraints(enableProvenanceText, c);
+		add(enableProvenanceText);
+
+		c.insets = new Insets(0, 0, 5, 0);
+		c.fill = GridBagConstraints.NONE;
+		gridbag.setConstraints(enableInMemory, c);
+		add(enableInMemory);
+
+		c.insets = new Insets(0, 20, 15, 20);
+		c.fill = HORIZONTAL;
+		gridbag.setConstraints(enableInMemoryText, c);
+		add(enableInMemoryText);
+
+		c.insets = new Insets(0, 20, 15, 20);
+		c.fill = HORIZONTAL;
+		gridbag.setConstraints(enableInMemoryTextDisabled, c);
+		add(enableInMemoryTextDisabled);
+
+		c.insets = new Insets(0, 20, 15, 20);
+		gridbag.setConstraints(portPanel, c);
+		add(portPanel);
+
+		c.insets = new Insets(0, 0, 5, 0);
+		c.fill = NONE;
+		exposeDatanatureBox = new JCheckBox(
+				"Allow setting of input data encoding");
+		gridbag.setConstraints(exposeDatanatureBox, c);
+		add(exposeDatanatureBox);
+
+		exposeDatanatureText = new JTextArea(
+				"Select if you want to control how Taverna handles files read as input data");
+		exposeDatanatureText.setLineWrap(true);
+		exposeDatanatureText.setWrapStyleWord(true);
+		exposeDatanatureText.setEditable(false);
+		exposeDatanatureText.setFocusable(false);
+		exposeDatanatureText.setOpaque(false);
+		exposeDatanatureText.setFont(plain);
+
+		c.insets = new Insets(0, 20, 15, 20);
+		c.fill = HORIZONTAL;
+		gridbag.setConstraints(exposeDatanatureText, c);
+		add(exposeDatanatureText);
+
+		JPanel buttonPanel = createButtonPanel();
+		c.weightx = 1.0;
+		c.weighty = 1.0;
+		c.fill = BOTH;
+		c.insets = new Insets(0, 0, 5, 0);
+		gridbag.setConstraints(buttonPanel, c);
+		add(buttonPanel);
+		return gridbag;
+	}
+
+	private JComponent createDerbyServerStatusComponent() {
+		DialogTextArea textArea = new DialogTextArea();
+		boolean running;
+
+		try (Connection connection = databaseManager.getConnection()) {
+			running = databaseManager.isRunning();
+		} catch (Exception e) {
+			running = false;
+		}
+
+		if (running)
+			textArea.setText("The database is currently running on port: "
+					+ configuration.getCurrentPort() + ".");
+		else
+			textArea.setText("Unable to retrieve a database connection - "
+					+ "the database is not available.");
+
+		textArea.setLineWrap(true);
+		textArea.setWrapStyleWord(true);
+		textArea.setEditable(false);
+		textArea.setFocusable(false);
+		textArea.setOpaque(false);
+		textArea.setAlignmentX(CENTER_ALIGNMENT);
+		textArea.setFont(textArea.getFont().deriveFont(PLAIN, 11));
+		textArea.setVisible(configuration.getStartInternalDerbyServer());
+		return textArea;
+	}
+
+	// for testing only
+//	public static void main(String[] args) {
+//		JDialog dialog = new JDialog();
+//		dialog.add(new DataManagementConfigurationPanel());
+//		dialog.setModal(true);
+//		dialog.setSize(500, 300);
+//		dialog.setVisible(true);
+//		System.exit(0);
+//	}
+
+	public void resetFields() {
+		enableInMemory.setSelected(configuration.isInMemory());
+		enableProvenance.setSelected(configuration.isProvenanceEnabled());
+		exposeDatanatureBox.setSelected(configuration.isExposeDatanature());
+
+		if (ADD_WARNING_LISTENERS) {
+			enableInMemoryTextDisabled.setVisible(enableProvenance.isSelected()
+					&& enableInMemory.isSelected());
+		}
+	}
+
+	/*private boolean workflowInstances() {
+		return DataflowRunsComponent.getInstance().getRunListCount()>0;
+	}*/
+
+	private void applySettings() {
+		configuration.setProvenanceEnabled(enableProvenance.isSelected());
+		configuration.setInMemory(enableInMemory.isSelected());
+		configuration.setExposeDatanature(exposeDatanatureBox.isSelected());
+	}
+
+	private JPanel createButtonPanel() {
+		final JPanel panel = new JPanel();
+
+		helpButton = new JButton(new AbstractAction("Help") {
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				showHelp(panel);
+			}
+		});
+		panel.add(helpButton);
+
+		resetButton = new JButton(new AbstractAction("Reset") {
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				resetFields();
+			}
+		});
+		panel.add(resetButton);
+
+		applyButton = new JButton(new AbstractAction("Apply") {
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				applySettings();
+				resetFields();
+			}
+		});
+		panel.add(applyButton);
+
+		return panel;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationUIFactory.java
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationUIFactory.java b/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationUIFactory.java
new file mode 100644
index 0000000..2799c7e
--- /dev/null
+++ b/taverna-data-management-config-ui/src/main/java/net/sf/taverna/t2/workbench/reference/config/DataManagementConfigurationUIFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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.workbench.reference.config;
+
+import javax.swing.JPanel;
+
+import uk.org.taverna.configuration.Configurable;
+import uk.org.taverna.configuration.ConfigurationUIFactory;
+import uk.org.taverna.configuration.database.DatabaseConfiguration;
+import uk.org.taverna.configuration.database.DatabaseManager;
+
+public class DataManagementConfigurationUIFactory implements
+		ConfigurationUIFactory {
+	private DatabaseConfiguration databaseConfiguration;
+	private DatabaseManager databaseManager;
+
+	private DataManagementConfigurationPanel configPanel;
+
+	@Override
+	public boolean canHandle(String uuid) {
+		return uuid.equals(getConfigurable().getUUID());
+	}
+
+	@Override
+	public JPanel getConfigurationPanel() {
+		if (configPanel == null)
+			configPanel = new DataManagementConfigurationPanel(
+					databaseConfiguration, databaseManager);
+		configPanel.resetFields();
+		return configPanel;
+	}
+
+	@Override
+	public Configurable getConfigurable() {
+		return databaseConfiguration;
+	}
+
+	public void setDatabaseConfiguration(
+			DatabaseConfiguration databaseConfiguration) {
+		this.databaseConfiguration = databaseConfiguration;
+	}
+
+	public void setDatabaseManager(DatabaseManager databaseManager) {
+		this.databaseManager = databaseManager;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory b/taverna-data-management-config-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
new file mode 100644
index 0000000..8afa6ca
--- /dev/null
+++ b/taverna-data-management-config-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
@@ -0,0 +1 @@
+net.sf.taverna.t2.workbench.reference.config.DataManagementConfigurationUIFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context-osgi.xml b/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context-osgi.xml
new file mode 100644
index 0000000..89f84a7
--- /dev/null
+++ b/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context-osgi.xml
@@ -0,0 +1,14 @@
+<?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="DataManagementConfigurationUIFactory" interface="uk.org.taverna.configuration.ConfigurationUIFactory" />
+
+	<reference id="databaseConfiguration" interface="uk.org.taverna.configuration.database.DatabaseConfiguration" />
+	<reference id="databaseManager" interface="uk.org.taverna.configuration.database.DatabaseManager" />
+
+</beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context.xml
----------------------------------------------------------------------
diff --git a/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context.xml b/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context.xml
new file mode 100644
index 0000000..f9f40ed
--- /dev/null
+++ b/taverna-data-management-config-ui/src/main/resources/META-INF/spring/data-management-config-ui-context.xml
@@ -0,0 +1,11 @@
+<?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="DataManagementConfigurationUIFactory" class="net.sf.taverna.t2.workbench.reference.config.DataManagementConfigurationUIFactory">
+		<property name="databaseConfiguration" ref="databaseConfiguration"/>
+		<property name="databaseManager" ref="databaseManager"/>
+	</bean>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-design-ui/pom.xml b/taverna-design-ui/pom.xml
new file mode 100644
index 0000000..0c549bd
--- /dev/null
+++ b/taverna-design-ui/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<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.workbench</groupId>
+		<artifactId>taverna-workbench</artifactId>
+		<version>3.1.0-incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-design-ui</artifactId>
+	<name>Apache Taverna Design UI</name>
+	<packaging>bundle</packaging>
+	<dependencies>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-activity-icons-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-edits-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-contextual-views-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-selection-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-ui</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-api</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+	</dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddConditionAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddConditionAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddConditionAction.java
new file mode 100644
index 0000000..510775f
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddConditionAction.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.AddChildEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.common.Scufl2Tools;
+import uk.org.taverna.scufl2.api.core.BlockingControlLink;
+import uk.org.taverna.scufl2.api.core.Processor;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.profiles.ProcessorBinding;
+
+/**
+ * Action for adding a condition to the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class AddConditionAction extends DataflowEditAction {
+	private static final Logger logger = Logger.getLogger(AddConditionAction.class);
+	private static final Scufl2Tools scufl2Tools = new Scufl2Tools();
+
+	private Processor control;
+	private Processor target;
+
+	public AddConditionAction(Workflow dataflow, Processor control,
+			Processor target, Component component, EditManager editManager,
+			SelectionManager selectionManager,
+			ActivityIconManager activityIconManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.control = control;
+		this.target = target;
+		ProcessorBinding processorBinding = scufl2Tools
+				.processorBindingForProcessor(control, dataflow.getParent()
+						.getMainProfile());
+		putValue(SMALL_ICON,
+				activityIconManager.iconForActivity(processorBinding
+						.getBoundActivity().getType()));
+		putValue(NAME, control.getName());
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent event) {
+		try {
+			BlockingControlLink controlLink = new BlockingControlLink();
+			controlLink.setUntilFinished(control);
+			controlLink.setBlock(target);
+			editManager.doDataflowEdit(dataflow.getParent(),
+					new AddChildEdit<>(dataflow, controlLink));
+		} catch (EditException e) {
+			logger.debug("Create control link between '" + control.getName()
+					+ "' and '" + target.getName() + "' failed");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowInputAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowInputAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowInputAction.java
new file mode 100644
index 0000000..ff56997
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowInputAction.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.taverna.t2.lang.ui.ValidatingUserInputDialog;
+import net.sf.taverna.t2.workbench.design.ui.DataflowInputPortPanel;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.AddWorkflowInputPortEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.InputWorkflowPort;
+
+/**
+ * Action for adding an input port to the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class AddDataflowInputAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(AddDataflowInputAction.class);
+
+	public AddDataflowInputAction(Workflow dataflow, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		putValue(SMALL_ICON, WorkbenchIcons.inputIcon);
+		putValue(NAME, "Workflow input port");
+		putValue(SHORT_DESCRIPTION, "Add workflow input port");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent event) {
+		try {
+			Set<String> usedInputPorts = new HashSet<>();
+			for (InputWorkflowPort inputPort : dataflow.getInputPorts())
+				usedInputPorts.add(inputPort.getName());
+
+			DataflowInputPortPanel inputPanel = new DataflowInputPortPanel();
+
+			ValidatingUserInputDialog vuid = new ValidatingUserInputDialog(
+					"Add Workflow Input Port", inputPanel);
+			vuid.addTextComponentValidation(inputPanel.getPortNameField(),
+					"Set the workflow input port name.", usedInputPorts,
+					"Duplicate workflow input port name.",
+					"[\\p{L}\\p{Digit}_.]+",
+					"Invalid workflow input port name.");
+			vuid.addMessageComponent(inputPanel.getSingleValueButton(),
+					"Set the input port type.");
+			vuid.addMessageComponent(inputPanel.getListValueButton(),
+					"Set the input port list depth.");
+			vuid.setSize(new Dimension(400, 250));
+
+			inputPanel.setPortDepth(0);
+
+			if (vuid.show(component)) {
+				InputWorkflowPort dataflowInputPort = new InputWorkflowPort();
+				dataflowInputPort.setName(inputPanel.getPortName());
+				dataflowInputPort.setDepth(inputPanel.getPortDepth());
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new AddWorkflowInputPortEdit(dataflow,
+								dataflowInputPort));
+			}
+		} catch (EditException e) {
+			logger.warn("Adding a new workflow input port failed");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowOutputAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowOutputAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowOutputAction.java
new file mode 100644
index 0000000..98bf8be
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/AddDataflowOutputAction.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.taverna.t2.lang.ui.ValidatingUserInputDialog;
+import net.sf.taverna.t2.workbench.design.ui.DataflowOutputPortPanel;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.AddWorkflowOutputPortEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.OutputWorkflowPort;
+
+/**
+ * Action for adding an output port to the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class AddDataflowOutputAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(AddDataflowOutputAction.class);
+
+	public AddDataflowOutputAction(Workflow dataflow, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		putValue(SMALL_ICON, WorkbenchIcons.outputIcon);
+		putValue(NAME, "Workflow output port");
+		putValue(SHORT_DESCRIPTION, "Add workflow output port");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent event) {
+		try {
+			Set<String> usedOutputPorts = new HashSet<>();
+			for (OutputWorkflowPort outputPort : dataflow.getOutputPorts())
+				usedOutputPorts.add(outputPort.getName());
+
+			DataflowOutputPortPanel inputPanel = new DataflowOutputPortPanel();
+
+			ValidatingUserInputDialog vuid = new ValidatingUserInputDialog(
+					"Add Workflow Output Port", inputPanel);
+			vuid.addTextComponentValidation(inputPanel.getPortNameField(),
+					"Set the workflow output port name.", usedOutputPorts,
+					"Duplicate workflow output port name.",
+					"[\\p{L}\\p{Digit}_.]+",
+					"Invalid workflow output port name.");
+			vuid.setSize(new Dimension(400, 200));
+
+			if (vuid.show(component)) {
+				String portName = inputPanel.getPortName();
+				OutputWorkflowPort dataflowOutputPort = new OutputWorkflowPort();
+				dataflowOutputPort.setName(portName);
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new AddWorkflowOutputPortEdit(dataflow,
+								dataflowOutputPort));
+			}
+		} catch (EditException e) {
+			logger.debug("Create workflow output port failed", e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/DataflowEditAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/DataflowEditAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/DataflowEditAction.java
new file mode 100644
index 0000000..a2ca5ea
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/DataflowEditAction.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+
+import javax.swing.AbstractAction;
+
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.DataflowSelectionModel;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import uk.org.taverna.scufl2.api.common.Scufl2Tools;
+import uk.org.taverna.scufl2.api.core.Workflow;
+
+/**
+ * Abstract superclass of dataflow edit actions.
+ * 
+ * @author David Withers
+ */
+public abstract class DataflowEditAction extends AbstractAction {
+	private static final long serialVersionUID = -1155192575675025091L;
+
+	protected final SelectionManager selectionManager;
+	protected EditManager editManager;
+	protected DataflowSelectionModel dataflowSelectionModel;
+	protected Workflow dataflow;
+	protected Component component;
+	protected Scufl2Tools scufl2Tools = new Scufl2Tools();
+
+	public DataflowEditAction(Workflow dataflow, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		this.dataflow = dataflow;
+		this.component = component;
+		this.editManager = editManager;
+		this.selectionManager = selectionManager;
+		dataflowSelectionModel = selectionManager
+				.getDataflowSelectionModel(dataflow.getParent());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowInputPortAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowInputPortAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowInputPortAction.java
new file mode 100644
index 0000000..e4513d2
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowInputPortAction.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.taverna.t2.lang.ui.ValidatingUserInputDialog;
+import net.sf.taverna.t2.workbench.design.ui.DataflowInputPortPanel;
+import net.sf.taverna.t2.workbench.edits.CompoundEdit;
+import net.sf.taverna.t2.workbench.edits.Edit;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.ChangeDepthEdit;
+import net.sf.taverna.t2.workflow.edits.RenameEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.InputWorkflowPort;
+
+/**
+ * Action for editing a dataflow input port.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class EditDataflowInputPortAction extends DataflowEditAction {
+	private static Logger logger = Logger
+			.getLogger(EditDataflowInputPortAction.class);
+
+	private InputWorkflowPort port;
+
+	public EditDataflowInputPortAction(Workflow dataflow,
+			InputWorkflowPort port, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.port = port;
+		putValue(SMALL_ICON, WorkbenchIcons.renameIcon);
+		putValue(NAME, "Edit workflow input port...");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		Set<String> usedInputPorts = new HashSet<>();
+		for (InputWorkflowPort usedInputPort : dataflow.getInputPorts())
+			if (!usedInputPort.getName().equals(port.getName()))
+				usedInputPorts.add(usedInputPort.getName());
+
+		DataflowInputPortPanel inputPanel = new DataflowInputPortPanel();
+
+		ValidatingUserInputDialog vuid = new ValidatingUserInputDialog(
+				"Edit Workflow Input Port", inputPanel);
+		vuid.addTextComponentValidation(inputPanel.getPortNameField(),
+				"Set the workflow input port name.", usedInputPorts,
+				"Duplicate workflow input port name.", "[\\p{L}\\p{Digit}_.]+",
+				"Invalid workflow input port name.");
+		vuid.addMessageComponent(inputPanel.getSingleValueButton(),
+				"Set the input port type.");
+		vuid.addMessageComponent(inputPanel.getListValueButton(),
+				"Set the input port list depth.");
+		vuid.setSize(new Dimension(400, 250));
+
+		inputPanel.setPortName(port.getName());
+		inputPanel.setPortDepth(port.getDepth());
+
+		try {
+			if (vuid.show(component))
+				changeInputPort(inputPanel);
+		} catch (EditException e1) {
+			logger.warn("Rename workflow input port failed", e1);
+		}
+	}
+
+	private void changeInputPort(DataflowInputPortPanel inputPanel)
+			throws EditException {
+		List<Edit<?>> editList = new ArrayList<>();
+		String portName = inputPanel.getPortName();
+		if (!portName.equals(port.getName()))
+			editList.add(new RenameEdit<>(port, portName));
+		int portDepth = inputPanel.getPortDepth();
+		if (portDepth != port.getDepth())
+			editList.add(new ChangeDepthEdit<>(port, portDepth));
+		if (editList.size() == 1)
+			editManager.doDataflowEdit(dataflow.getParent(), editList.get(0));
+		else if (editList.size() > 1)
+			editManager.doDataflowEdit(dataflow.getParent(), new CompoundEdit(
+					editList));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowOutputPortAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowOutputPortAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowOutputPortAction.java
new file mode 100644
index 0000000..da7c0e2
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/EditDataflowOutputPortAction.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.taverna.t2.lang.ui.ValidatingUserInputDialog;
+import net.sf.taverna.t2.workbench.design.ui.DataflowOutputPortPanel;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RenameEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.OutputWorkflowPort;
+
+/**
+ * Action for editing a dataflow output port.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class EditDataflowOutputPortAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(EditDataflowOutputPortAction.class);
+
+	private OutputWorkflowPort port;
+
+	public EditDataflowOutputPortAction(Workflow dataflow,
+			OutputWorkflowPort port, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.port = port;
+		putValue(SMALL_ICON, WorkbenchIcons.renameIcon);
+		putValue(NAME, "Edit workflow output port...");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		Set<String> usedOutputPorts = new HashSet<>();
+		for (OutputWorkflowPort usedOutputPort : dataflow.getOutputPorts())
+			if (!usedOutputPort.getName().equals(port.getName()))
+				usedOutputPorts.add(usedOutputPort.getName());
+
+		DataflowOutputPortPanel inputPanel = new DataflowOutputPortPanel();
+
+		ValidatingUserInputDialog vuid = new ValidatingUserInputDialog(
+				"Edit Workflow Output Port", inputPanel);
+		vuid.addTextComponentValidation(inputPanel.getPortNameField(),
+				"Set the workflow output port name.", usedOutputPorts,
+				"Duplicate workflow output port name.",
+				"[\\p{L}\\p{Digit}_.]+", "Invalid workflow output port name.");
+		vuid.setSize(new Dimension(400, 200));
+
+		inputPanel.setPortName(port.getName());
+
+		try {
+			if (vuid.show(component))
+				changeOutputPort(inputPanel);
+		} catch (EditException ex) {
+			logger.debug("Rename workflow output port failed", ex);
+		}
+	}
+
+	private void changeOutputPort(DataflowOutputPortPanel inputPanel)
+			throws EditException {
+		editManager.doDataflowEdit(dataflow.getParent(), new RenameEdit<>(port,
+				inputPanel.getPortName()));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveConditionAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveConditionAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveConditionAction.java
new file mode 100644
index 0000000..89036f0
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveConditionAction.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.deleteIcon;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RemoveChildEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.ControlLink;
+import uk.org.taverna.scufl2.api.core.Workflow;
+
+/**
+ * Action for removing a condition from the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class RemoveConditionAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(RemoveConditionAction.class);
+
+	private ControlLink controlLink;
+
+	public RemoveConditionAction(Workflow dataflow, ControlLink controlLink,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.controlLink = controlLink;
+		putValue(SMALL_ICON, deleteIcon);
+		putValue(NAME, "Delete control link");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		try {
+			dataflowSelectionModel.removeSelection(controlLink);
+			editManager.doDataflowEdit(dataflow.getParent(),
+					new RemoveChildEdit<>(dataflow, controlLink));
+		} catch (EditException e1) {
+			logger.debug("Delete control link failed", e1);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowInputPortAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowInputPortAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowInputPortAction.java
new file mode 100644
index 0000000..5483ea5
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowInputPortAction.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.deleteIcon;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.taverna.t2.workbench.edits.CompoundEdit;
+import net.sf.taverna.t2.workbench.edits.Edit;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RemoveDataLinkEdit;
+import net.sf.taverna.t2.workflow.edits.RemoveWorkflowInputPortEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.DataLink;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.InputWorkflowPort;
+
+/**
+ * Action for removing an input port from the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class RemoveDataflowInputPortAction extends DataflowEditAction {
+	private static Logger logger = Logger
+			.getLogger(RemoveDataflowInputPortAction.class);
+
+	private InputWorkflowPort port;
+
+	public RemoveDataflowInputPortAction(Workflow dataflow,
+			InputWorkflowPort port, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.port = port;
+		putValue(SMALL_ICON, deleteIcon);
+		putValue(NAME, "Delete workflow input port");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		try {
+			dataflowSelectionModel.removeSelection(port);
+			List<DataLink> datalinks = scufl2Tools.datalinksFrom(port);
+			if (datalinks.isEmpty())
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new RemoveWorkflowInputPortEdit(dataflow, port));
+			else {
+				List<Edit<?>> editList = new ArrayList<>();
+				for (DataLink datalink : datalinks)
+					editList.add(new RemoveDataLinkEdit(dataflow, datalink));
+				editList.add(new RemoveWorkflowInputPortEdit(dataflow, port));
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new CompoundEdit(editList));
+			}
+		} catch (EditException e1) {
+			logger.debug("Delete workflow input port failed", e1);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowOutputPortAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowOutputPortAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowOutputPortAction.java
new file mode 100644
index 0000000..ed91d41
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDataflowOutputPortAction.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.deleteIcon;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.taverna.t2.workbench.edits.CompoundEdit;
+import net.sf.taverna.t2.workbench.edits.Edit;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RemoveDataLinkEdit;
+import net.sf.taverna.t2.workflow.edits.RemoveWorkflowOutputPortEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.DataLink;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.OutputWorkflowPort;
+
+/**
+ * Action for removing an output port from the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class RemoveDataflowOutputPortAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(RemoveDataflowOutputPortAction.class);
+
+	private OutputWorkflowPort port;
+
+	public RemoveDataflowOutputPortAction(Workflow dataflow,
+			OutputWorkflowPort port, Component component,
+			EditManager editManager, SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.port = port;
+		putValue(SMALL_ICON, deleteIcon);
+		putValue(NAME, "Delete workflow output port");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		try {
+			dataflowSelectionModel.removeSelection(port);
+			List<DataLink> datalinks = scufl2Tools.datalinksTo(port);
+			if (datalinks.isEmpty())
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new RemoveWorkflowOutputPortEdit(dataflow, port));
+			else {
+				List<Edit<?>> editList = new ArrayList<>();
+				for (DataLink datalink : datalinks)
+					editList.add(new RemoveDataLinkEdit(dataflow, datalink));
+				editList.add(new RemoveWorkflowOutputPortEdit(dataflow, port));
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new CompoundEdit(editList));
+			}
+		} catch (EditException ex) {
+			logger.debug("Delete workflow output port failed", ex);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDatalinkAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDatalinkAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDatalinkAction.java
new file mode 100644
index 0000000..e4df75d
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveDatalinkAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.deleteIcon;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RemoveDataLinkEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.DataLink;
+import uk.org.taverna.scufl2.api.core.Workflow;
+
+/**
+ * Action for removing a datalink from the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class RemoveDatalinkAction extends DataflowEditAction {
+	private static final Logger logger = Logger.getLogger(RemoveDatalinkAction.class);
+
+	private DataLink datalink;
+
+	public RemoveDatalinkAction(Workflow dataflow, DataLink datalink,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.datalink = datalink;
+		putValue(SMALL_ICON, deleteIcon);
+		putValue(NAME, "Delete data link");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent ev) {
+		try {
+			dataflowSelectionModel.removeSelection(datalink);
+			editManager.doDataflowEdit(dataflow.getParent(),
+					new RemoveDataLinkEdit(dataflow, datalink));
+		} catch (EditException ex) {
+			logger.debug("Delete data link failed", ex);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveProcessorAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveProcessorAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveProcessorAction.java
new file mode 100644
index 0000000..063a346
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RemoveProcessorAction.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.deleteIcon;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.taverna.t2.workbench.edits.CompoundEdit;
+import net.sf.taverna.t2.workbench.edits.Edit;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RemoveChildEdit;
+import net.sf.taverna.t2.workflow.edits.RemoveDataLinkEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.activity.Activity;
+import uk.org.taverna.scufl2.api.common.NamedSet;
+import uk.org.taverna.scufl2.api.configurations.Configuration;
+import uk.org.taverna.scufl2.api.core.BlockingControlLink;
+import uk.org.taverna.scufl2.api.core.ControlLink;
+import uk.org.taverna.scufl2.api.core.DataLink;
+import uk.org.taverna.scufl2.api.core.Processor;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.port.InputProcessorPort;
+import uk.org.taverna.scufl2.api.port.OutputProcessorPort;
+import uk.org.taverna.scufl2.api.profiles.ProcessorBinding;
+import uk.org.taverna.scufl2.api.profiles.Profile;
+
+/**
+ * Action for removing a processor from the dataflow.
+ * 
+ * @author David Withers
+ */
+@SuppressWarnings("serial")
+public class RemoveProcessorAction extends DataflowEditAction {
+	private static final Logger logger = Logger
+			.getLogger(RemoveProcessorAction.class);
+
+	private Processor processor;
+
+	public RemoveProcessorAction(Workflow dataflow, Processor processor,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.processor = processor;
+		putValue(SMALL_ICON, deleteIcon);
+		putValue(NAME, "Delete service");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		try {
+			dataflowSelectionModel.removeSelection(processor);
+
+			NamedSet<InputProcessorPort> inputPorts = processor.getInputPorts();
+			NamedSet<OutputProcessorPort> outputPorts = processor
+					.getOutputPorts();
+			List<BlockingControlLink> controlLinksBlocking = scufl2Tools
+					.controlLinksBlocking(processor);
+			List<BlockingControlLink> controlLinksWaitingFor = scufl2Tools
+					.controlLinksWaitingFor(processor);
+			List<Edit<?>> editList = new ArrayList<>();
+			for (InputProcessorPort inputPort : inputPorts)
+				for (DataLink datalink : scufl2Tools.datalinksTo(inputPort))
+					editList.add(new RemoveDataLinkEdit(dataflow, datalink));
+			for (OutputProcessorPort outputPort : outputPorts)
+				for (DataLink datalink : scufl2Tools.datalinksFrom(outputPort))
+					editList.add(new RemoveDataLinkEdit(dataflow, datalink));
+			for (ControlLink controlLink : controlLinksBlocking)
+				editList.add(new RemoveChildEdit<>(dataflow, controlLink));
+			for (ControlLink controlLink : controlLinksWaitingFor)
+				editList.add(new RemoveChildEdit<>(dataflow, controlLink));
+
+			for (Profile profile : dataflow.getParent().getProfiles()) {
+				List<ProcessorBinding> processorBindings = scufl2Tools
+						.processorBindingsForProcessor(processor, profile);
+				for (ProcessorBinding processorBinding : processorBindings) {
+					Activity boundActivity = processorBinding
+							.getBoundActivity();
+					List<ProcessorBinding> processorBindingsToActivity = scufl2Tools
+							.processorBindingsToActivity(boundActivity);
+					if (processorBindingsToActivity.size() == 1) {
+						editList.add(new RemoveChildEdit<>(profile,
+								boundActivity));
+						for (Configuration configuration : scufl2Tools
+								.configurationsFor(boundActivity, profile))
+							editList.add(new RemoveChildEdit<Profile>(profile,
+									configuration));
+					}
+					editList.add(new RemoveChildEdit<Profile>(profile,
+							processorBinding));
+				}
+			}
+			for (Profile profile : dataflow.getParent().getProfiles()) {
+				List<Configuration> configurations = scufl2Tools
+						.configurationsFor(processor, profile);
+				for (Configuration configuration : configurations)
+					editList.add(new RemoveChildEdit<>(profile, configuration));
+			}
+			if (editList.isEmpty())
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new RemoveChildEdit<>(dataflow, processor));
+			else {
+				editList.add(new RemoveChildEdit<>(dataflow, processor));
+				editManager.doDataflowEdit(dataflow.getParent(),
+						new CompoundEdit(editList));
+			}
+		} catch (EditException e1) {
+			logger.error("Delete processor failed", e1);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/52fd79dd/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RenameProcessorAction.java
----------------------------------------------------------------------
diff --git a/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RenameProcessorAction.java b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RenameProcessorAction.java
new file mode 100644
index 0000000..5b5b733
--- /dev/null
+++ b/taverna-design-ui/src/main/java/net/sf/taverna/t2/workbench/design/actions/RenameProcessorAction.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.workbench.design.actions;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.taverna.t2.lang.ui.ValidatingUserInputDialog;
+import net.sf.taverna.t2.workbench.design.ui.ProcessorPanel;
+import net.sf.taverna.t2.workbench.edits.EditException;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workflow.edits.RenameEdit;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.scufl2.api.core.Processor;
+import uk.org.taverna.scufl2.api.core.Workflow;
+
+/**
+ * Action for renaming a processor.
+ * 
+ * @author David Withers
+ */
+public class RenameProcessorAction extends DataflowEditAction {
+
+	private static final long serialVersionUID = 1L;
+
+	private static Logger logger = Logger
+			.getLogger(RenameProcessorAction.class);
+
+	private Processor processor;
+
+	public RenameProcessorAction(Workflow dataflow, Processor processor,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
+		super(dataflow, component, editManager, selectionManager);
+		this.processor = processor;
+		putValue(SMALL_ICON, WorkbenchIcons.renameIcon);
+		putValue(NAME, "Rename service...");
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		Set<String> usedProcessors = new HashSet<>();
+		for (Processor usedProcessor : dataflow.getProcessors())
+			if (!usedProcessor.getName().equals(processor.getName()))
+				usedProcessors.add(usedProcessor.getName());
+
+		ProcessorPanel inputPanel = new ProcessorPanel();
+
+		ValidatingUserInputDialog vuid = new ValidatingUserInputDialog(
+				"Rename service", inputPanel);
+		vuid.addTextComponentValidation(inputPanel.getProcessorNameField(),
+				"Set the service name.", usedProcessors, "Duplicate service.",
+				"[\\p{L}\\p{Digit}_.]+", "Invalid service name.");
+		vuid.setSize(new Dimension(400, 200));
+
+		inputPanel.setProcessorName(processor.getName());
+
+		try {
+			if (vuid.show(component))
+				changeProcessorName(inputPanel);
+		} catch (EditException e1) {
+			logger.debug("Rename service (processor) failed", e1);
+		}
+	}
+
+	private void changeProcessorName(ProcessorPanel inputPanel)
+			throws EditException {
+		String processorName = inputPanel.getProcessorName();
+		editManager.doDataflowEdit(dataflow.getParent(), new RenameEdit<>(
+				processor, processorName));
+	}
+}