diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyGraphComponentAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyGraphComponentAction.java
index 74717f3..ae2defa 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyGraphComponentAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyGraphComponentAction.java
@@ -20,55 +20,52 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.actions;
 
-import java.awt.Toolkit;
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.event.KeyEvent.VK_C;
+import static java.awt.event.KeyEvent.VK_Y;
+import static javax.swing.KeyStroke.getKeyStroke;
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.copyIcon;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.copyProcessor;
+
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 import java.util.Set;
 
 import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.KeyStroke;
 
 import net.sf.taverna.t2.lang.observer.Observable;
 import net.sf.taverna.t2.lang.observer.Observer;
 import net.sf.taverna.t2.lang.observer.SwingAwareObserver;
 import net.sf.taverna.t2.ui.menu.DesignOnlyAction;
-import net.sf.taverna.t2.workbench.file.FileManager;
-import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
 import net.sf.taverna.t2.workbench.selection.DataflowSelectionModel;
 import net.sf.taverna.t2.workbench.selection.SelectionManager;
 import net.sf.taverna.t2.workbench.selection.events.DataflowSelectionMessage;
-import net.sf.taverna.t2.workbench.selection.events.WorkflowBundleSelectionEvent;
 import net.sf.taverna.t2.workbench.selection.events.SelectionManagerEvent;
-import net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView;
-
-import org.apache.log4j.Logger;
-
+import net.sf.taverna.t2.workbench.selection.events.WorkflowBundleSelectionEvent;
 import uk.org.taverna.scufl2.api.container.WorkflowBundle;
 import uk.org.taverna.scufl2.api.core.Processor;
 
 /**
  * An action that copies the selected graph component.
- *
+ * 
  * @author Alan R Williams
- *
+ * 
  */
 @SuppressWarnings("serial")
-public class CopyGraphComponentAction extends AbstractAction implements DesignOnlyAction {
-
-	/* Current workflow's selection model event observer. */
+public class CopyGraphComponentAction extends AbstractAction implements
+		DesignOnlyAction {
+	/** Current workflow's selection model event observer. */
 	private Observer<DataflowSelectionMessage> workflowSelectionObserver = new DataflowSelectionObserver();
-
 	private final SelectionManager selectionManager;
 
-	public CopyGraphComponentAction(final SelectionManager selectionManager) {
-		super("Copy", WorkbenchIcons.copyIcon);
+	public CopyGraphComponentAction(SelectionManager selectionManager) {
+		super("Copy", copyIcon);
 		this.selectionManager = selectionManager;
 		putValue(SHORT_DESCRIPTION, "Copy selected component");
-		putValue(Action.MNEMONIC_KEY, KeyEvent.VK_Y);
+		putValue(MNEMONIC_KEY, VK_Y);
 
-		putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit
-				.getDefaultToolkit().getMenuShortcutKeyMask()));
+		putValue(
+				ACCELERATOR_KEY,
+				getKeyStroke(VK_C, getDefaultToolkit().getMenuShortcutKeyMask()));
 		setEnabled(false);
 
 		selectionManager.addObserver(new SelectionManagerObserver());
@@ -78,28 +75,29 @@
 	 * Check if action should be enabled or disabled and update its status.
 	 */
 	public void updateStatus() {
-		WorkflowBundle workflowBundle = selectionManager.getSelectedWorkflowBundle();
-		DataflowSelectionModel selectionModel = selectionManager.getDataflowSelectionModel(workflowBundle);
+		WorkflowBundle workflowBundle = selectionManager
+				.getSelectedWorkflowBundle();
+		DataflowSelectionModel selectionModel = selectionManager
+				.getDataflowSelectionModel(workflowBundle);
 
 		// List of all selected objects in the graph view
 		Set<Object> selection = selectionModel.getSelection();
 
-		if (selection.isEmpty()) {
+		if (selection.isEmpty())
 			setEnabled(false);
-		} else {
-			// Take the first selected item - we only support single selections
-			// anyway
+		else {
+			/*
+			 * Take the first selected item - we only support single selections
+			 * anyway
+			 */
 			Object selected = selection.toArray()[0];
-			if (selected instanceof Processor) {
-				setEnabled(true);
-			} else {
-				setEnabled(false);
-			}
+			setEnabled (selected instanceof Processor);
 		}
 	}
 
+	@Override
 	public void actionPerformed(ActionEvent e) {
-		WorkflowView.copyProcessor(selectionManager);
+		copyProcessor(selectionManager);
 	}
 
 	/**
@@ -107,34 +105,39 @@
 	 * is selected in the graph view, and enables/disables this action
 	 * accordingly.
 	 */
-	private final class DataflowSelectionObserver extends SwingAwareObserver<DataflowSelectionMessage> {
+	private final class DataflowSelectionObserver extends
+			SwingAwareObserver<DataflowSelectionMessage> {
 		@Override
-		public void notifySwing(Observable<DataflowSelectionMessage> sender, DataflowSelectionMessage message) {
+		public void notifySwing(Observable<DataflowSelectionMessage> sender,
+				DataflowSelectionMessage message) {
 			updateStatus();
 		}
 	}
 
-	private final class SelectionManagerObserver extends SwingAwareObserver<SelectionManagerEvent> {
+	private final class SelectionManagerObserver extends
+			SwingAwareObserver<SelectionManagerEvent> {
 		@Override
-		public void notifySwing(Observable<SelectionManagerEvent> sender, SelectionManagerEvent message) {
+		public void notifySwing(Observable<SelectionManagerEvent> sender,
+				SelectionManagerEvent message) {
 			if (message instanceof WorkflowBundleSelectionEvent) {
-				WorkflowBundleSelectionEvent workflowBundleSelectionEvent = (WorkflowBundleSelectionEvent) message;
-				WorkflowBundle oldFlow = workflowBundleSelectionEvent.getPreviouslySelectedWorkflowBundle();
-				WorkflowBundle newFlow = workflowBundleSelectionEvent.getSelectedWorkflowBundle();
+				WorkflowBundleSelectionEvent event = (WorkflowBundleSelectionEvent) message;
+				WorkflowBundle oldFlow = event
+						.getPreviouslySelectedWorkflowBundle();
+				WorkflowBundle newFlow = event.getSelectedWorkflowBundle();
 				// Update the buttons status as current dataflow has changed
 				updateStatus();
 
-				// Remove the workflow selection model listener from the previous (if any)
-				// and add to the new workflow (if any)
-				if (oldFlow != null) {
-					selectionManager.getDataflowSelectionModel(oldFlow).removeObserver(workflowSelectionObserver);
-				}
-
-				if (newFlow != null) {
-					selectionManager.getDataflowSelectionModel(newFlow).addObserver(workflowSelectionObserver);
-				}
+				/*
+				 * Remove the workflow selection model listener from the
+				 * previous (if any) and add to the new workflow (if any)
+				 */
+				if (oldFlow != null)
+					selectionManager.getDataflowSelectionModel(oldFlow)
+							.removeObserver(workflowSelectionObserver);
+				if (newFlow != null)
+					selectionManager.getDataflowSelectionModel(newFlow)
+							.addObserver(workflowSelectionObserver);
 			}
 		}
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyProcessorAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyProcessorAction.java
index c4de04b..b262b76 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyProcessorAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CopyProcessorAction.java
@@ -20,39 +20,34 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.actions;
 
+import static java.awt.event.KeyEvent.VK_Y;
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.copyIcon;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.copyProcessor;
+
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 
 import javax.swing.AbstractAction;
-import javax.swing.Action;
-
-import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
-import net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView;
-
-import org.apache.log4j.Logger;
 
 import uk.org.taverna.scufl2.api.core.Processor;
 
 /**
  * Action for copying a processor.
- *
+ * 
  * @author Alan R Williams
  */
+@SuppressWarnings("serial")
 public class CopyProcessorAction extends AbstractAction {
-
-	private static Logger logger = Logger.getLogger(CopyProcessorAction.class);
-
 	private Processor processor;
 
 	public CopyProcessorAction(Processor processor) {
 		this.processor = processor;
-		putValue(SMALL_ICON, WorkbenchIcons.copyIcon);
+		putValue(SMALL_ICON, copyIcon);
 		putValue(NAME, "Copy");
-		putValue(Action.MNEMONIC_KEY, KeyEvent.VK_Y);
+		putValue(MNEMONIC_KEY, VK_Y);
 	}
 
+	@Override
 	public void actionPerformed(ActionEvent e) {
-			WorkflowView.copyProcessor(processor);
+		copyProcessor(processor);
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutGraphComponentAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutGraphComponentAction.java
index ae4e37f..c798c5e 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutGraphComponentAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutGraphComponentAction.java
@@ -20,31 +20,28 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.actions;
 
-import java.awt.Toolkit;
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.event.KeyEvent.VK_T;
+import static java.awt.event.KeyEvent.VK_X;
+import static javax.swing.KeyStroke.getKeyStroke;
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.cutIcon;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.cutProcessor;
+
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 import java.util.Set;
 
 import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.KeyStroke;
 
 import net.sf.taverna.t2.lang.observer.Observable;
 import net.sf.taverna.t2.lang.observer.Observer;
 import net.sf.taverna.t2.lang.observer.SwingAwareObserver;
 import net.sf.taverna.t2.ui.menu.DesignOnlyAction;
 import net.sf.taverna.t2.workbench.edits.EditManager;
-import net.sf.taverna.t2.workbench.file.FileManager;
-import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
 import net.sf.taverna.t2.workbench.selection.DataflowSelectionModel;
 import net.sf.taverna.t2.workbench.selection.SelectionManager;
 import net.sf.taverna.t2.workbench.selection.events.DataflowSelectionMessage;
-import net.sf.taverna.t2.workbench.selection.events.WorkflowBundleSelectionEvent;
 import net.sf.taverna.t2.workbench.selection.events.SelectionManagerEvent;
-import net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView;
-
-import org.apache.log4j.Logger;
-
+import net.sf.taverna.t2.workbench.selection.events.WorkflowBundleSelectionEvent;
 import uk.org.taverna.scufl2.api.container.WorkflowBundle;
 import uk.org.taverna.scufl2.api.core.Processor;
 
@@ -52,29 +49,27 @@
  * An action that copies the selected graph component.
  *
  * @author Alan R Williams
- *
  */
 @SuppressWarnings("serial")
 public class CutGraphComponentAction extends AbstractAction implements DesignOnlyAction {
-
-	/* Current workflow's selection model event observer. */
+	/** Current workflow's selection model event observer. */
 	private Observer<DataflowSelectionMessage> workflowSelectionObserver = new DataflowSelectionObserver();
 
-	private WorkflowBundle dataflow;
 	private Processor processor;
 
 	private final EditManager editManager;
 	private final SelectionManager selectionManager;
 
 	public CutGraphComponentAction(EditManager editManager, SelectionManager selectionManager) {
-		super("Cut", WorkbenchIcons.cutIcon);
+		super("Cut", cutIcon);
 		this.editManager = editManager;
 		this.selectionManager = selectionManager;
 		putValue(SHORT_DESCRIPTION, "Cut selected component");
-		putValue(Action.MNEMONIC_KEY, KeyEvent.VK_T);
+		putValue(MNEMONIC_KEY, VK_T);
 
-		putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit
-				.getDefaultToolkit().getMenuShortcutKeyMask()));
+		putValue(
+				ACCELERATOR_KEY,
+				getKeyStroke(VK_X, getDefaultToolkit().getMenuShortcutKeyMask()));
 		setEnabled(false);
 
 		selectionManager.addObserver(new SelectionManagerObserver());
@@ -84,40 +79,46 @@
 	 * Check if action should be enabled or disabled and update its status.
 	 */
 	public void updateStatus() {
-		WorkflowBundle workflowBundle = selectionManager.getSelectedWorkflowBundle();
-		DataflowSelectionModel selectionModel = selectionManager.getDataflowSelectionModel(workflowBundle);
+		WorkflowBundle workflowBundle = selectionManager
+				.getSelectedWorkflowBundle();
+		DataflowSelectionModel selectionModel = selectionManager
+				.getDataflowSelectionModel(workflowBundle);
 
 		// List of all selected objects in the graph view
 		Set<Object> selection = selectionModel.getSelection();
 
-		if (selection.isEmpty()) {
+		if (selection.isEmpty())
 			setEnabled(false);
-		} else {
-			// Take the first selected item - we only support single selections anyway
+		else {
+			/*
+			 * Take the first selected item - we only support single selections
+			 * anyway
+			 */
 			Object selected = selection.toArray()[0];
 			if (selected instanceof Processor) {
 				processor = (Processor) selected;
-				this.dataflow = dataflow;
 				setEnabled(true);
-			} else {
+			} else
 				setEnabled(false);
-			}
 		}
 	}
 
+	@Override
 	public void actionPerformed(ActionEvent e) {
-		WorkflowView.cutProcessor(processor.getParent(), processor, null, editManager,
+		cutProcessor(processor.getParent(), processor, null, editManager,
 				selectionManager);
 	}
 
 	/**
-	 * Observes events on workflow Selection Manager, i.e. when a workflow node is selected in the
-	 * graph view, and enables/disables this action accordingly.
+	 * Observes events on workflow Selection Manager, i.e. when a workflow node
+	 * is selected in the graph view, and enables/disables this action
+	 * accordingly.
 	 */
 	private final class DataflowSelectionObserver extends
 			SwingAwareObserver<DataflowSelectionMessage> {
 		@Override
-		public void notifySwing(Observable<DataflowSelectionMessage> sender, DataflowSelectionMessage message) {
+		public void notifySwing(Observable<DataflowSelectionMessage> sender,
+				DataflowSelectionMessage message) {
 			updateStatus();
 		}
 	}
@@ -136,19 +137,17 @@
 				// Update the buttons status as current dataflow has changed
 				updateStatus();
 
-				// Remove the workflow selection model listener from the previous (if any)
-				// and add to the new workflow (if any)
-				if (oldFlow != null) {
-					selectionManager.getDataflowSelectionModel(oldFlow).removeObserver(
-							workflowSelectionObserver);
-				}
-
-				if (newFlow != null) {
-					selectionManager.getDataflowSelectionModel(newFlow).addObserver(
-							workflowSelectionObserver);
-				}
+				/*
+				 * Remove the workflow selection model listener from the
+				 * previous (if any) and add to the new workflow (if any)
+				 */
+				if (oldFlow != null)
+					selectionManager.getDataflowSelectionModel(oldFlow)
+							.removeObserver(workflowSelectionObserver);
+				if (newFlow != null)
+					selectionManager.getDataflowSelectionModel(newFlow)
+							.addObserver(workflowSelectionObserver);
 			}
 		}
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutProcessorAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutProcessorAction.java
index ea0aee9..96d0aa5 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutProcessorAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/CutProcessorAction.java
@@ -20,50 +20,50 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.actions;
 
+import static java.awt.event.KeyEvent.VK_C;
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.cutIcon;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.cutProcessor;
+
 import java.awt.Component;
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 
 import javax.swing.AbstractAction;
-import javax.swing.Action;
 
 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.workbench.ui.workflowview.WorkflowView;
 import uk.org.taverna.scufl2.api.core.Processor;
 import uk.org.taverna.scufl2.api.core.Workflow;
 
 /**
  * Action for copying a processor.
- *
+ * 
  * @author Alan R Williams
  */
+@SuppressWarnings("serial")
 public class CutProcessorAction extends AbstractAction {
-
 	private Processor processor;
-
 	private Workflow dataflow;
-
 	private Component component;
 
 	private final EditManager editManager;
-
 	private final SelectionManager selectionManager;
 
-	public CutProcessorAction(Workflow dataflow, Processor processor, Component component, EditManager editManager, SelectionManager selectionManager) {
+	public CutProcessorAction(Workflow dataflow, Processor processor,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
 		this.dataflow = dataflow;
 		this.processor = processor;
 		this.component = component;
 		this.editManager = editManager;
 		this.selectionManager = selectionManager;
-		putValue(SMALL_ICON, WorkbenchIcons.cutIcon);
+		putValue(SMALL_ICON, cutIcon);
 		putValue(NAME, "Cut");
-		putValue(Action.MNEMONIC_KEY, KeyEvent.VK_C);
+		putValue(MNEMONIC_KEY, VK_C);
 	}
 
+	@Override
 	public void actionPerformed(ActionEvent e) {
-			WorkflowView.cutProcessor(dataflow, processor, component, editManager, selectionManager);
+		cutProcessor(dataflow, processor, component, editManager,
+				selectionManager);
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/PasteGraphComponentAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/PasteGraphComponentAction.java
index 67d7815..0c88c79 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/PasteGraphComponentAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/actions/PasteGraphComponentAction.java
@@ -20,37 +20,33 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.actions;
 
-import java.awt.Toolkit;
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.event.KeyEvent.VK_P;
+import static java.awt.event.KeyEvent.VK_V;
+import static javax.swing.KeyStroke.getKeyStroke;
+import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.pasteIcon;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.pasteTransferable;
+
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.KeyStroke;
 
 import net.sf.taverna.t2.ui.menu.MenuManager;
 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.workbench.ui.workflowview.WorkflowView;
-
-import org.apache.log4j.Logger;
-
 import uk.org.taverna.commons.services.ServiceRegistry;
 
 /**
  * An action that pastes a graph component
  *
  * @author Alan R Williams
- *
  */
 @SuppressWarnings("serial")
+//TODO this class appears to be non-OSGi-fied
 public class PasteGraphComponentAction extends AbstractAction {
-
 	private static PasteGraphComponentAction instance = null;
 
-	private static Logger logger = Logger.getLogger(PasteGraphComponentAction.class);
-
 	private static boolean enabled = false;
 
 	private final EditManager editManager;
@@ -58,30 +54,37 @@
 	private final SelectionManager selectionManager;
 	private final ServiceRegistry serviceRegistry;
 
-	private PasteGraphComponentAction(EditManager editManager, MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
+	private PasteGraphComponentAction(EditManager editManager,
+			MenuManager menuManager, SelectionManager selectionManager,
+			ServiceRegistry serviceRegistry) {
 		super();
 		this.editManager = editManager;
 		this.menuManager = menuManager;
 		this.selectionManager = selectionManager;
 		this.serviceRegistry = serviceRegistry;
-		putValue(SMALL_ICON, WorkbenchIcons.pasteIcon);
+		putValue(SMALL_ICON, pasteIcon);
 		putValue(NAME, "Paste");
 		putValue(SHORT_DESCRIPTION, "Paste");
-		putValue(Action.MNEMONIC_KEY, KeyEvent.VK_P);
+		putValue(MNEMONIC_KEY, VK_P);
 
-		putValue(Action.ACCELERATOR_KEY,
-				KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+		putValue(
+				ACCELERATOR_KEY,
+				getKeyStroke(VK_V, getDefaultToolkit().getMenuShortcutKeyMask()));
 		setEnabled(enabled);
 	}
 
+	@Override
 	public void actionPerformed(ActionEvent e) {
-		WorkflowView.pasteTransferable(editManager, menuManager, selectionManager, serviceRegistry);
+		pasteTransferable(editManager, menuManager, selectionManager,
+				serviceRegistry);
 	}
 
-	public static Action getInstance(EditManager editManager, MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
-		if (instance == null) {
-			instance = new PasteGraphComponentAction(editManager, menuManager, selectionManager, serviceRegistry);
-		}
+	public static Action getInstance(EditManager editManager,
+			MenuManager menuManager, SelectionManager selectionManager,
+			ServiceRegistry serviceRegistry) {
+		if (instance == null)
+			instance = new PasteGraphComponentAction(editManager, menuManager,
+					selectionManager, serviceRegistry);
 		return instance;
 	}
 
@@ -92,5 +95,4 @@
 			instance.setEnabled(enabled);
 		}
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/dndhandler/ServiceTransferHandler.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/dndhandler/ServiceTransferHandler.java
index 2e9b1b1..ef5a1cd 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/dndhandler/ServiceTransferHandler.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/dndhandler/ServiceTransferHandler.java
@@ -20,6 +20,11 @@
  ******************************************************************************/
 package net.sf.taverna.t2.workbench.ui.dndhandler;
 
+import static java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.copyProcessor;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.cutProcessor;
+import static net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView.pasteTransferable;
+
 import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
@@ -31,7 +36,6 @@
 import net.sf.taverna.t2.ui.menu.MenuManager;
 import net.sf.taverna.t2.workbench.edits.EditManager;
 import net.sf.taverna.t2.workbench.selection.SelectionManager;
-import net.sf.taverna.t2.workbench.ui.workflowview.WorkflowView;
 
 import org.apache.log4j.Logger;
 
@@ -45,10 +49,8 @@
  * @author David Withers
  * @author Alan R Williams
  */
+@SuppressWarnings("serial")
 public class ServiceTransferHandler extends TransferHandler {
-
-	private static final long serialVersionUID = 1L;
-
 	private static Logger logger = Logger.getLogger(ServiceTransferHandler.class);
 
 	private DataFlavor serviceDescriptionDataFlavor;
@@ -58,8 +60,9 @@
 	private final SelectionManager selectionManager;
 	private final ServiceRegistry serviceRegistry;
 
-	public ServiceTransferHandler(EditManager editManager, MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
-
+	public ServiceTransferHandler(EditManager editManager,
+			MenuManager menuManager, SelectionManager selectionManager,
+			ServiceRegistry serviceRegistry) {
 		this.editManager = editManager;
 		this.menuManager = menuManager;
 		this.selectionManager = selectionManager;
@@ -67,7 +70,7 @@
 
 		try {
 			serviceDescriptionDataFlavor = new DataFlavor(
-					DataFlavor.javaJVMLocalObjectMimeType + ";class="
+					javaJVMLocalObjectMimeType + ";class="
 							+ ServiceDescription.class.getCanonicalName(),
 					"ServiceDescription", getClass().getClassLoader());
 		} catch (ClassNotFoundException e) {
@@ -79,11 +82,9 @@
 	@Override
 	public boolean canImport(JComponent component, DataFlavor[] dataFlavors) {
 		logger.debug("Trying to import something");
-		for (DataFlavor dataFlavor : dataFlavors) {
-			if (dataFlavor.equals(serviceDescriptionDataFlavor)) {
+		for (DataFlavor dataFlavor : dataFlavors)
+			if (dataFlavor.equals(serviceDescriptionDataFlavor))
 				return true;
-			}
-		}
 		return false;
 	}
 
@@ -91,14 +92,17 @@
 	public boolean importData(JComponent component, Transferable transferable) {
 		logger.info("Importing a transferable");
 		logger.debug(component.getClass().getCanonicalName());
-		WorkflowView.pasteTransferable(transferable, editManager, menuManager, selectionManager, serviceRegistry);
+		pasteTransferable(transferable, editManager, menuManager,
+				selectionManager, serviceRegistry);
 		return true;
 	}
 
+	@Override
 	protected Transferable createTransferable(JComponent c) {
 		return null;
 	}
 
+	@Override
 	public int getSourceActions(JComponent c) {
 		return COPY_OR_MOVE;
 	}
@@ -107,10 +111,9 @@
 	public void exportToClipboard(JComponent comp, Clipboard clip, int action)
 			throws IllegalStateException {
 		super.exportToClipboard(comp, clip, action);
-		if (action == COPY) {
-			WorkflowView.copyProcessor(selectionManager);
-		} else if (action == MOVE) {
-			WorkflowView.cutProcessor(editManager, selectionManager);
-		}
+		if (action == COPY)
+			copyProcessor(selectionManager);
+		else if (action == MOVE)
+			cutProcessor(editManager, selectionManager);
 	}
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyGraphComponentMenuAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyGraphComponentMenuAction.java
index b05f168..9d32058 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyGraphComponentMenuAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyGraphComponentMenuAction.java
@@ -25,25 +25,22 @@
 import javax.swing.Action;
 
 import net.sf.taverna.t2.ui.menu.AbstractMenuAction;
-import net.sf.taverna.t2.workbench.file.FileManager;
 import net.sf.taverna.t2.workbench.selection.SelectionManager;
 import net.sf.taverna.t2.workbench.ui.actions.CopyGraphComponentAction;
 
 /**
- *
  * @author Alan R Williams
- *
  */
 public class CopyGraphComponentMenuAction extends AbstractMenuAction {
-
 	private static final URI COPY_GRAPH_COMPONENT_URI = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#graphMenuCopyGraphComponent");
 
 	private SelectionManager selectionManager;
 
 	public CopyGraphComponentMenuAction() {
-		super(URI
-				.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"), 12, COPY_GRAPH_COMPONENT_URI);
+		super(
+				URI.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"),
+				12, COPY_GRAPH_COMPONENT_URI);
 	}
 
 	@Override
@@ -54,9 +51,4 @@
 	public void setSelectionManager(SelectionManager selectionManager) {
 		this.selectionManager = selectionManager;
 	}
-
 }
-
-
-
-
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyProcessorMenuAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyProcessorMenuAction.java
index b87c578..2af61b0 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyProcessorMenuAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CopyProcessorMenuAction.java
@@ -25,17 +25,14 @@
 
 import javax.swing.Action;
 
+import net.sf.taverna.t2.ui.menu.AbstractContextualMenuAction;
+import net.sf.taverna.t2.workbench.ui.actions.CopyProcessorAction;
 import uk.org.taverna.scufl2.api.core.Processor;
 import uk.org.taverna.scufl2.api.core.Workflow;
 
-import net.sf.taverna.t2.ui.menu.AbstractContextualMenuAction;
-import net.sf.taverna.t2.workbench.ui.actions.CopyProcessorAction;
-
 public class CopyProcessorMenuAction extends AbstractContextualMenuAction {
-
 	public static final URI editSection = URI
-	.create("http://taverna.sf.net/2009/contextMenu/edit");
-
+			.create("http://taverna.sf.net/2009/contextMenu/edit");
 
 	public CopyProcessorMenuAction() {
 		super(editSection, 20);
@@ -48,6 +45,7 @@
 	}
 
 	@Override
+	@SuppressWarnings("unused")
 	protected Action createAction() {
 		Workflow dataflow = (Workflow) getContextualSelection().getParent();
 		Processor processor = (Processor) getContextualSelection()
@@ -55,5 +53,4 @@
 		Component component = getContextualSelection().getRelativeToComponent();
 		return new CopyProcessorAction(processor);
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutGraphComponentMenuAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutGraphComponentMenuAction.java
index de1b999..3e088fe 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutGraphComponentMenuAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutGraphComponentMenuAction.java
@@ -30,12 +30,9 @@
 import net.sf.taverna.t2.workbench.ui.actions.CutGraphComponentAction;
 
 /**
- *
  * @author Alan R Williams
- *
  */
 public class CutGraphComponentMenuAction extends AbstractMenuAction {
-
 	private static final URI CUT_GRAPH_COMPONENT_URI = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#graphMenuCutGraphComponent");
 
@@ -43,8 +40,9 @@
 	private SelectionManager selectionManager;
 
 	public CutGraphComponentMenuAction() {
-		super(URI
-				.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"), 11, CUT_GRAPH_COMPONENT_URI);
+		super(
+				URI.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"),
+				11, CUT_GRAPH_COMPONENT_URI);
 	}
 
 	@Override
@@ -59,9 +57,4 @@
 	public void setSelectionManager(SelectionManager selectionManager) {
 		this.selectionManager = selectionManager;
 	}
-
 }
-
-
-
-
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutProcessorMenuAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutProcessorMenuAction.java
index f787a99..5c68fd6 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutProcessorMenuAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/CutProcessorMenuAction.java
@@ -34,9 +34,8 @@
 import net.sf.taverna.t2.workbench.ui.actions.CutProcessorAction;
 
 public class CutProcessorMenuAction extends AbstractContextualMenuAction {
-
 	public static final URI editSection = URI
-	.create("http://taverna.sf.net/2009/contextMenu/edit");
+			.create("http://taverna.sf.net/2009/contextMenu/edit");
 	private EditManager editManager;
 	private SelectionManager selectionManager;
 
@@ -50,7 +49,8 @@
 		Processor processor = (Processor) getContextualSelection()
 				.getSelection();
 		Component component = getContextualSelection().getRelativeToComponent();
-		return new CutProcessorAction(dataflow, processor, component, editManager, selectionManager);
+		return new CutProcessorAction(dataflow, processor, component,
+				editManager, selectionManager);
 	}
 
 	@Override
@@ -66,5 +66,4 @@
 	public void setSelectionManager(SelectionManager selectionManager) {
 		this.selectionManager = selectionManager;
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/PasteGraphComponentMenuAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/PasteGraphComponentMenuAction.java
index 98b0c07..25fa3a9 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/PasteGraphComponentMenuAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/menu/PasteGraphComponentMenuAction.java
@@ -33,12 +33,9 @@
 import net.sf.taverna.t2.workbench.ui.actions.PasteGraphComponentAction;
 
 /**
- *
  * @author Alan R Williams
- *
  */
 public class PasteGraphComponentMenuAction extends AbstractMenuAction {
-
 	private static final URI PASTE_GRAPH_COMPONENT_URI = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#graphMenuPasteGraphComponent");
 	private EditManager editManager;
@@ -47,13 +44,15 @@
 	private ServiceRegistry serviceRegistry;
 
 	public PasteGraphComponentMenuAction() {
-		super(URI
-				.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"), 13, PASTE_GRAPH_COMPONENT_URI);
+		super(
+				URI.create("http://taverna.sf.net/2008/t2workbench/menu#graphCopyMenuSection"),
+				13, PASTE_GRAPH_COMPONENT_URI);
 	}
 
 	@Override
 	protected Action createAction() {
-		return PasteGraphComponentAction.getInstance(editManager, menuManager, selectionManager, serviceRegistry);
+		return PasteGraphComponentAction.getInstance(editManager, menuManager,
+				selectionManager, serviceRegistry);
 	}
 
 	public void setEditManager(EditManager editManager) {
@@ -71,9 +70,4 @@
 	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
 		this.serviceRegistry = serviceRegistry;
 	}
-
 }
-
-
-
-
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CopyToolbarAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CopyToolbarAction.java
index d05c023..2ae53bc 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CopyToolbarAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CopyToolbarAction.java
@@ -29,7 +29,6 @@
 import net.sf.taverna.t2.workbench.ui.actions.CopyGraphComponentAction;
 
 public class CopyToolbarAction extends AbstractMenuAction {
-
 	private static final URI EDIT_TOOLBAR_SECTION = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#editToolbarSection");
 	private static final URI EDIT_TOOLBAR_COPY_URI = URI
@@ -49,5 +48,4 @@
 	public void setSelectionManager(SelectionManager selectionManager) {
 		this.selectionManager = selectionManager;
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CutToolbarAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CutToolbarAction.java
index 7332921..e792fc1 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CutToolbarAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/CutToolbarAction.java
@@ -30,7 +30,6 @@
 import net.sf.taverna.t2.workbench.ui.actions.CutGraphComponentAction;
 
 public class CutToolbarAction extends AbstractMenuAction {
-
 	private static final URI EDIT_TOOLBAR_SECTION = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#editToolbarSection");
 	private static final URI EDIT_TOOLBAR_CUT_URI = URI
@@ -55,5 +54,4 @@
 	public void setSelectionManager(SelectionManager selectionManager) {
 		this.selectionManager = selectionManager;
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/PasteToolbarAction.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/PasteToolbarAction.java
index 6987756..c28c522 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/PasteToolbarAction.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/toolbar/PasteToolbarAction.java
@@ -33,7 +33,6 @@
 import net.sf.taverna.t2.workbench.ui.actions.PasteGraphComponentAction;
 
 public class PasteToolbarAction extends AbstractMenuAction {
-
 	private static final URI EDIT_TOOLBAR_SECTION = URI
 			.create("http://taverna.sf.net/2008/t2workbench/menu#editToolbarSection");
 	private static final URI EDIT_TOOLBAR_PASTE_URI = URI
@@ -49,7 +48,8 @@
 
 	@Override
 	protected Action createAction() {
-		return PasteGraphComponentAction.getInstance(editManager, menuManager, selectionManager, serviceRegistry);
+		return PasteGraphComponentAction.getInstance(editManager, menuManager,
+				selectionManager, serviceRegistry);
 	}
 
 	public void setEditManager(EditManager editManager) {
@@ -67,5 +67,4 @@
 	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
 		this.serviceRegistry = serviceRegistry;
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/ShowExceptionRunnable.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/ShowExceptionRunnable.java
index 52af977..05403bc 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/ShowExceptionRunnable.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/ShowExceptionRunnable.java
@@ -3,14 +3,13 @@
  */
 package net.sf.taverna.t2.workbench.ui.workflowview;
 
-import javax.swing.JOptionPane;
+import static javax.swing.JOptionPane.ERROR_MESSAGE;
+import static javax.swing.JOptionPane.showMessageDialog;
 
 /**
  * @author alanrw
- *
  */
 public class ShowExceptionRunnable implements Runnable {
-	
 	Exception e;
 	private final String message;
 
@@ -19,12 +18,9 @@
 		this.e = e;
 	}
 
-	/* (non-Javadoc)
-	 * @see java.lang.Runnable#run()
-	 */
 	@Override
 	public void run() {
-		JOptionPane.showMessageDialog(null, message + ": " + e.getMessage(), "Service addition problem", JOptionPane.ERROR_MESSAGE);
+		showMessageDialog(null, message + ": " + e.getMessage(),
+				"Service addition problem", ERROR_MESSAGE);
 	}
-
 }
diff --git a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/WorkflowView.java b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/WorkflowView.java
index 8006106..0be5fd0 100644
--- a/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/WorkflowView.java
+++ b/workflow-view/src/main/java/net/sf/taverna/t2/workbench/ui/workflowview/WorkflowView.java
@@ -1,8 +1,11 @@
 package net.sf.taverna.t2.workbench.ui.workflowview;
 
+import static java.awt.GraphicsEnvironment.isHeadless;
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType;
+import static javax.swing.SwingUtilities.invokeLater;
+
 import java.awt.Component;
-import java.awt.GraphicsEnvironment;
-import java.awt.Toolkit;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
@@ -10,14 +13,12 @@
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
 import javax.swing.Action;
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
-import javax.swing.SwingUtilities;
 
 import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
 import net.sf.taverna.t2.ui.menu.MenuManager;
@@ -34,7 +35,9 @@
 import net.sf.taverna.t2.workflow.edits.AddProcessorEdit;
 
 import org.apache.log4j.Logger;
-import org.jdom.Element;
+//import org.jdom.Element;
+
+
 
 import uk.org.taverna.commons.services.ActivityTypeNotFoundException;
 import uk.org.taverna.commons.services.InvalidConfigurationException;
@@ -56,46 +59,48 @@
 import uk.org.taverna.scufl2.api.profiles.Profile;
 
 /**
- *
  * Super class for all UIComponentSPIs that display a Workflow
- *
+ * 
  * @author alanrw
- *
  */
 public class WorkflowView {
-
-	public static Element copyRepresentation = null;
+	//public static Element copyRepresentation = null;
 
 	private static Logger logger = Logger.getLogger(WorkflowView.class);
 
 	private static DataFlavor processorFlavor = null;
 	private static DataFlavor serviceDescriptionDataFlavor = null;
-	private static HashMap<String, Element> requiredSubworkflows = new HashMap<String, Element>();
+	//private static HashMap<String, Element> requiredSubworkflows = new HashMap<>();
 
 	private static String UNABLE_TO_ADD_SERVICE = "Unable to add service";
+	@SuppressWarnings("unused")
 	private static String UNABLE_TO_COPY_SERVICE = "Unable to copy service";
 
+	@SuppressWarnings("unused")
 	private static Scufl2Tools scufl2Tools = new Scufl2Tools();
 
 	static {
-		if (serviceDescriptionDataFlavor == null) {
-			try {
-				serviceDescriptionDataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
-						+ ";class=" + ServiceDescription.class.getCanonicalName(),
-						"ServiceDescription", ServiceDescription.class.getClassLoader());
-				if (processorFlavor == null) {
-					processorFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
-							+ ";class=" + Processor.class.getCanonicalName(), "Processor",
-							Processor.class.getClassLoader());
-				}
-			} catch (ClassNotFoundException e) {
-				logger.error(e);
+		try {
+			if (serviceDescriptionDataFlavor == null) {
+				serviceDescriptionDataFlavor = new DataFlavor(
+						javaJVMLocalObjectMimeType + ";class="
+								+ ServiceDescription.class.getCanonicalName(),
+						"ServiceDescription",
+						ServiceDescription.class.getClassLoader());
+				if (processorFlavor == null)
+					processorFlavor = new DataFlavor(javaJVMLocalObjectMimeType
+							+ ";class=" + Processor.class.getCanonicalName(),
+							"Processor", Processor.class.getClassLoader());
 			}
+		} catch (ClassNotFoundException e) {
+			logger.error(e);
 		}
 	}
 
-	public final static Processor importServiceDescription(ServiceDescription sd, boolean rename, EditManager editManager,
-			MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
+	public final static Processor importServiceDescription(
+			ServiceDescription sd, boolean rename, EditManager editManager,
+			MenuManager menuManager, SelectionManager selectionManager,
+			ServiceRegistry serviceRegistry) {
 		Workflow workflow = selectionManager.getSelectedWorkflow();
 		Profile profile = selectionManager.getSelectedProfile();
 
@@ -117,57 +122,64 @@
 		processorBinding.setBoundActivity(activity);
 
 		try {
-			for (InputActivityPort activityPort : serviceRegistry.getActivityInputPorts(activityType, configuration.getJson())) {
+			for (InputActivityPort activityPort : serviceRegistry
+					.getActivityInputPorts(activityType,
+							configuration.getJson())) {
 				// add port to activity
 				activityPort.setParent(activity);
 				// create processor port
-				InputProcessorPort processorPort = new InputProcessorPort(processor, activityPort.getName());
+				InputProcessorPort processorPort = new InputProcessorPort(
+						processor, activityPort.getName());
 				processorPort.setDepth(activityPort.getDepth());
 				// add a new port binding
-				new ProcessorInputPortBinding(processorBinding, processorPort, activityPort);
+				new ProcessorInputPortBinding(processorBinding, processorPort,
+						activityPort);
 			}
-			for (OutputActivityPort activityPort : serviceRegistry.getActivityOutputPorts(activityType, configuration.getJson())) {
+			for (OutputActivityPort activityPort : serviceRegistry
+					.getActivityOutputPorts(activityType,
+							configuration.getJson())) {
 				// add port to activity
 				activityPort.setParent(activity);
 				// create processor port
-				OutputProcessorPort processorPort = new OutputProcessorPort(processor, activityPort.getName());
+				OutputProcessorPort processorPort = new OutputProcessorPort(
+						processor, activityPort.getName());
 				processorPort.setDepth(activityPort.getDepth());
 				processorPort.setGranularDepth(activityPort.getGranularDepth());
 				// add a new port binding
-				new ProcessorOutputPortBinding(processorBinding, activityPort, processorPort);
+				new ProcessorOutputPortBinding(processorBinding, activityPort,
+						processorPort);
 			}
 		} catch (InvalidConfigurationException | ActivityTypeNotFoundException e) {
 			logger.warn("Unable to get activity ports for configuration", e);
 		}
 
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		editList.add(new AddChildEdit<Profile>(profile, activity));
-		editList.add(new AddChildEdit<Profile>(profile, configuration));
-		editList.add(new AddChildEdit<Profile>(profile, processorBinding));
+		List<Edit<?>> editList = new ArrayList<>();
+		editList.add(new AddChildEdit<>(profile, activity));
+		editList.add(new AddChildEdit<>(profile, configuration));
+		editList.add(new AddChildEdit<>(profile, processorBinding));
 		editList.add(new AddProcessorEdit(workflow, processor));
 		Edit<?> insertionEdit = sd.getInsertionEdit(workflow, processor, activity);
-		if (insertionEdit != null) {
+		if (insertionEdit != null)
 			editList.add(insertionEdit);
-		}
 		try {
-			editManager.doDataflowEdit(workflow.getParent(), new CompoundEdit(editList));
+			editManager.doDataflowEdit(workflow.getParent(), new CompoundEdit(
+					editList));
 		} catch (EditException e) {
 			showException(UNABLE_TO_ADD_SERVICE, e);
 			logger.warn("Could not add processor : edit error", e);
 			processor = null;
 		}
 
-		if ((processor != null) && rename) {
-			RenameProcessorAction rpa = new RenameProcessorAction(workflow, processor, null, editManager, selectionManager);
+		if (processor != null && rename) {
+			RenameProcessorAction rpa = new RenameProcessorAction(workflow,
+					processor, null, editManager, selectionManager);
 			rpa.actionPerformed(new ActionEvent(sd, 0, ""));
 		}
 
-		if ((processor != null) && sd.isTemplateService()) {
+		if (processor != null && sd.isTemplateService()) {
 			Action action = getConfigureAction(processor, menuManager);
-			if (action != null) {
+			if (action != null)
 				action.actionPerformed(new ActionEvent(sd, 0, ""));
-			}
-
 		}
 		return processor;
 	}
@@ -180,7 +192,8 @@
 			if (c instanceof JMenuItem) {
 				JMenuItem menuItem = (JMenuItem) c;
 				Action action = menuItem.getAction();
-				if ((action != null) && (action instanceof ActivityConfigurationAction)
+				if (action != null
+						&& action instanceof ActivityConfigurationAction
 						&& action.isEnabled()) {
 					if (result != null) {
 						// do not return anything if there are two matches
@@ -196,31 +209,33 @@
 		return result;
 	}
 
-	public static void pasteTransferable(Transferable t, EditManager editManager, MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
-		if (t.isDataFlavorSupported(processorFlavor)) {
+	public static void pasteTransferable(Transferable t,
+			EditManager editManager, MenuManager menuManager,
+			SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
+		if (t.isDataFlavorSupported(processorFlavor))
 			pasteProcessor(t, editManager);
-		} else if (t.isDataFlavorSupported(serviceDescriptionDataFlavor)) {
+		else if (t.isDataFlavorSupported(serviceDescriptionDataFlavor))
 			try {
 				ServiceDescription data = (ServiceDescription) t
 						.getTransferData(serviceDescriptionDataFlavor);
-				importServiceDescription(data, false, editManager, menuManager, selectionManager, serviceRegistry);
-			} catch (UnsupportedFlavorException e) {
-				showException(UNABLE_TO_ADD_SERVICE, e);
-				logger.error(e);
-			} catch (IOException e) {
+				importServiceDescription(data, false, editManager, menuManager,
+						selectionManager, serviceRegistry);
+			} catch (UnsupportedFlavorException | IOException e) {
 				showException(UNABLE_TO_ADD_SERVICE, e);
 				logger.error(e);
 			}
-
-		}
 	}
 
-	public static void pasteTransferable(EditManager editManager, MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
-		pasteTransferable(Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null), editManager, menuManager, selectionManager, serviceRegistry);
-
+	public static void pasteTransferable(EditManager editManager,
+			MenuManager menuManager, SelectionManager selectionManager,
+			ServiceRegistry serviceRegistry) {
+		pasteTransferable(
+				getDefaultToolkit().getSystemClipboard().getContents(null),
+				editManager, menuManager, selectionManager, serviceRegistry);
 	}
 
 	public static void pasteProcessor(Transferable t, EditManager editManager) {
+		//FIXME
 //		try {
 //			Element e = (Element) t.getTransferData(processorFlavor);
 //			WorkflowBundle currentDataflow = (WorkflowBundle) ModelMap.getInstance().getModel(
@@ -303,15 +318,13 @@
 		// Get all selected components
 		Set<Object> selectedWFComponents = dataFlowSelectionModel.getSelection();
 		Processor p = null;
-		for (Object selectedWFComponent : selectedWFComponents) {
+		for (Object selectedWFComponent : selectedWFComponents)
 			if (selectedWFComponent instanceof Processor) {
 				p = (Processor) selectedWFComponent;
 				break;
 			}
-		}
-		if (p != null) {
+		if (p != null)
 			copyProcessor(p);
-		}
 	}
 
 	public static void copyProcessor(Processor p) {
@@ -386,15 +399,16 @@
 //		}
 	}
 
-	public static void cutProcessor(Workflow dataflow, Processor processor, Component component, EditManager editManager, SelectionManager selectionManager) {
+	public static void cutProcessor(Workflow dataflow, Processor processor,
+			Component component, EditManager editManager,
+			SelectionManager selectionManager) {
 		copyProcessor(processor);
-		new RemoveProcessorAction(dataflow, processor, component, editManager, selectionManager).actionPerformed(null);
-
+		new RemoveProcessorAction(dataflow, processor, component, editManager,
+				selectionManager).actionPerformed(null);
 	}
 
 	private static void showException(String message, Exception e) {
-		if (!GraphicsEnvironment.isHeadless()) {
-			SwingUtilities.invokeLater(new ShowExceptionRunnable(message, e));
-		}
+		if (!isHeadless())
+			invokeLater(new ShowExceptionRunnable(message, e));
 	}
 }
