diff --git a/pom.xml b/pom.xml
index 52fdae6..b48b4bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,43 +1,27 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>net.sf.taverna.t2</groupId>
 		<artifactId>ui-activities</artifactId>
-		<version>1.3-SNAPSHOT</version>
+		<version>2.0-SNAPSHOT</version>
 	</parent>
-  <groupId>net.sf.taverna.t2.ui-activities</groupId>
-  <artifactId>xpath-activity-ui</artifactId>
-  <name>XPath Activity - UI bindings</name>
-  
-  <dependencies>
-  	<dependency>
-  		<groupId>net.sf.taverna.t2.activities</groupId>
-  		<artifactId>xpath-activity</artifactId>
-  		<version>${t2.activities.version}</version>
-  		<type>jar</type>
-  		<scope>compile</scope>
-  	</dependency>
-  	
-  	<dependency>
-  		<groupId>dom4j</groupId>
-  		<artifactId>dom4j</artifactId>
-  		<version>${dom4j.version}</version>
-  	</dependency>
-  	<dependency>
-  		<groupId>jaxen</groupId>
-  		<artifactId>jaxen</artifactId>
-  		<version>${jaxen.version}</version>
-  		<type>jar</type>
-  		<scope>compile</scope>
-  	</dependency>
-  	
-  	<dependency>
-  		<groupId>net.sf.taverna.t2.ui-api</groupId>
-  		<artifactId>activity-icons-api</artifactId>
-  		<version>${t2.ui.api.version}</version>
-  		<type>jar</type>
-  	</dependency>
-  	<dependency>
+	<groupId>net.sf.taverna.t2.ui-activities</groupId>
+	<artifactId>xpath-activity-ui</artifactId>
+	<packaging>bundle</packaging>
+	<name>XPath Activity - UI bindings</name>
+	<dependencies>
+		<dependency>
+			<groupId>net.sf.taverna.t2.activities</groupId>
+			<artifactId>xpath-activity</artifactId>
+			<version>${t2.activities.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.taverna.t2.ui-api</groupId>
+			<artifactId>activity-icons-api</artifactId>
+			<version>${t2.ui.api.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>net.sf.taverna.t2.ui-api</groupId>
 			<artifactId>contextual-views-api</artifactId>
 			<version>${t2.ui.api.version}</version>
@@ -47,33 +31,37 @@
 			<artifactId>menu-api</artifactId>
 			<version>${t2.ui.api.version}</version>
 		</dependency>
-	
-		<!-- for AbstractConfigureActivityMenuAction -->
 		<dependency>
-      <groupId>net.sf.taverna.t2.ui-impl</groupId>
-      <artifactId>activity-tools</artifactId>
-      <version>${t2.ui.impl.version}</version>
-    </dependency>
-    
-        		<dependency>
+			<groupId>net.sf.taverna.t2.ui-api</groupId>
+			<artifactId>report-api</artifactId>
+			<version>${t2.ui.api.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>net.sf.taverna.t2.ui-components</groupId>
 			<artifactId>workflow-view</artifactId>
 			<version>${t2.ui.components.version}</version>
 		</dependency>
-		<dependency>
-			<groupId>net.sf.taverna.t2.ui-components</groupId>
-			<artifactId>graph-view</artifactId>
-			<version>${t2.ui.components.version}</version>
-		</dependency>
- 
-    
-    <!-- for ColourManager -->
-    <dependency>
-      <groupId>net.sf.taverna.t2.ui-impl</groupId>
-      <artifactId>configuration-impl</artifactId>
-      <version>${t2.ui.impl.version}</version>
-    </dependency>
-    
-  </dependencies>
-  
+	</dependencies>
+
+	<repositories>
+		<repository>
+			<releases />
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+			<id>mygrid-repository</id>
+			<name>myGrid Repository</name>
+			<url>http://www.mygrid.org.uk/maven/repository
+			</url>
+		</repository>
+		<repository>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+			<snapshots />
+			<id>mygrid-snapshot-repository</id>
+			<name>myGrid Snapshot Repository</name>
+			<url>http://www.mygrid.org.uk/maven/snapshot-repository</url>
+		</repository>
+	</repositories>
 </project>
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/TwoFieldQueryPanel.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/TwoFieldQueryPanel.java
index 1d47391..d0f131a 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/TwoFieldQueryPanel.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/TwoFieldQueryPanel.java
@@ -9,109 +9,102 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-
 /**
  * Auxiliary class that creates a JPanel with two labels and two text fields.
- * 
+ *
  * It can be used to be placed into a dialog made by JOptionPane to get two
- * input values, not just one.   
- * 
+ * input values, not just one.
+ *
  * @author Sergejs Aleksejevs
  */
-public class TwoFieldQueryPanel extends JPanel
-{
-  private JTextField tfFirstValue;
-  private JTextField tfSecondValue;
-  
-  
-  public TwoFieldQueryPanel(String firstFieldName, String secondFieldName)
-  {
-    this(null, firstFieldName, null, secondFieldName, null);
-  }
-  
-  public TwoFieldQueryPanel(String message, String firstFieldName, String secondFieldName)
-  {
-    this(message, firstFieldName, null, secondFieldName, null);
-  }
-  
-  public TwoFieldQueryPanel(String firstFieldName, String firstFieldDefaultValue,
-                            String secondFieldName, String secondFieldDefaultValue)
-  {
-    this(null, firstFieldName, firstFieldDefaultValue, secondFieldName, secondFieldDefaultValue);
-  }
-  
-  public TwoFieldQueryPanel(String message,
-                            String firstFieldName, String firstFieldDefaultValue,
-                            String secondFieldName, String secondFieldDefaultValue)
-  {
-    super();
-    this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-    
-    this.setLayout(new GridBagLayout());
-    GridBagConstraints c = new GridBagConstraints();
-    
-    c.gridx = 0;
-    c.gridy = 0;
-    c.weightx = 0;
-    c.fill = GridBagConstraints.HORIZONTAL;
-    c.anchor = GridBagConstraints.WEST;
-    c.insets = new Insets(3,5,3,5);
-    
-    
-    if (message != null && message.length() > 0)
-    {
-      c.gridwidth = 2;
-      c.insets = new Insets(5, 5, 15, 5);
-      this.add(new JLabel(message), c);
-      
-      c.gridwidth = 1;
-      c.gridx = 0;
-      c.gridy++;
-      c.insets = new Insets(3,5,3,5);
-    }
-    
-    
-    this.add(new JLabel(firstFieldName), c);
-    
-    c.gridx++;
-    c.weightx = 1.0;
-    tfFirstValue = new JTextField(20);
-    if (firstFieldDefaultValue != null) {
-      tfFirstValue.setText(firstFieldDefaultValue);
-    }
-    tfFirstValue.selectAll();
-    tfFirstValue.requestFocusInWindow();
-    this.add(tfFirstValue, c);
-    
-    c.gridx = 0;
-    c.gridy++;
-    c.weightx = 0;
-    this.add(new JLabel(secondFieldName), c);
-    
-    c.gridx++;
-    c.weightx = 1.0;
-    tfSecondValue = new JTextField(20);
-    if (secondFieldDefaultValue != null) {
-      tfSecondValue.setText(secondFieldDefaultValue);
-    }
-    tfSecondValue.selectAll();
-    this.add(tfSecondValue, c);
-  }
-  
-  
-  /**
-   * @return Trimmed value from the first text field. Guaranteed to be non-null.
-   */
-  public String getFirstValue() {
-    return (tfFirstValue.getText().trim());
-  }
-  
-  
-  /**
-   * @return Trimmed value from the second text field. Guaranteed to be non-null.
-   */
-  public String getSecondValue() {
-    return (tfSecondValue.getText().trim());
-  }
-  
+public class TwoFieldQueryPanel extends JPanel {
+	private JTextField tfFirstValue;
+	private JTextField tfSecondValue;
+
+	public TwoFieldQueryPanel(String firstFieldName, String secondFieldName) {
+		this(null, firstFieldName, null, secondFieldName, null);
+	}
+
+	public TwoFieldQueryPanel(String message, String firstFieldName,
+			String secondFieldName) {
+		this(message, firstFieldName, null, secondFieldName, null);
+	}
+
+	public TwoFieldQueryPanel(String firstFieldName,
+			String firstFieldDefaultValue, String secondFieldName,
+			String secondFieldDefaultValue) {
+		this(null, firstFieldName, firstFieldDefaultValue, secondFieldName,
+				secondFieldDefaultValue);
+	}
+
+	public TwoFieldQueryPanel(String message, String firstFieldName,
+			String firstFieldDefaultValue, String secondFieldName,
+			String secondFieldDefaultValue) {
+		super();
+		this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+
+		this.setLayout(new GridBagLayout());
+		GridBagConstraints c = new GridBagConstraints();
+
+		c.gridx = 0;
+		c.gridy = 0;
+		c.weightx = 0;
+		c.fill = GridBagConstraints.HORIZONTAL;
+		c.anchor = GridBagConstraints.WEST;
+		c.insets = new Insets(3, 5, 3, 5);
+
+		if (message != null && message.length() > 0) {
+			c.gridwidth = 2;
+			c.insets = new Insets(5, 5, 15, 5);
+			this.add(new JLabel(message), c);
+
+			c.gridwidth = 1;
+			c.gridx = 0;
+			c.gridy++;
+			c.insets = new Insets(3, 5, 3, 5);
+		}
+
+		this.add(new JLabel(firstFieldName), c);
+
+		c.gridx++;
+		c.weightx = 1.0;
+		tfFirstValue = new JTextField(20);
+		if (firstFieldDefaultValue != null) {
+			tfFirstValue.setText(firstFieldDefaultValue);
+		}
+		tfFirstValue.selectAll();
+		tfFirstValue.requestFocusInWindow();
+		this.add(tfFirstValue, c);
+
+		c.gridx = 0;
+		c.gridy++;
+		c.weightx = 0;
+		this.add(new JLabel(secondFieldName), c);
+
+		c.gridx++;
+		c.weightx = 1.0;
+		tfSecondValue = new JTextField(20);
+		if (secondFieldDefaultValue != null) {
+			tfSecondValue.setText(secondFieldDefaultValue);
+		}
+		tfSecondValue.selectAll();
+		this.add(tfSecondValue, c);
+	}
+
+	/**
+	 * @return Trimmed value from the first text field. Guaranteed to be
+	 *         non-null.
+	 */
+	public String getFirstValue() {
+		return (tfFirstValue.getText().trim());
+	}
+
+	/**
+	 * @return Trimmed value from the second text field. Guaranteed to be
+	 *         non-null.
+	 */
+	public String getSecondValue() {
+		return (tfSecondValue.getText().trim());
+	}
+
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
index 90e3878..5954986 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
@@ -2,48 +2,45 @@
 
 import java.awt.BorderLayout;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import javax.swing.BorderFactory;
 import javax.swing.JOptionPane;
 
-import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel;
-
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
 import net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean;
+import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel;
+import uk.org.taverna.commons.services.ServiceRegistry;
+import uk.org.taverna.scufl2.api.activity.Activity;
 
-@SuppressWarnings("serial")
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+
 /**
- * 
+ *
  * @author Sergejs Aleksejevs
+ * @author David Withers
  */
-public class XPathActivityConfigurationPanelProvider
-		extends
-		ActivityConfigurationPanel<XPathActivity, XPathActivityConfigurationBean> {
-	private XPathActivity activity;
-	private XPathActivityConfigurationBean configBean;
+@SuppressWarnings("serial")
+public class XPathActivityConfigurationPanelProvider extends ActivityConfigurationPanel {
 
 	private XPathActivityConfigurationPanel configPanel;
+	private final ServiceRegistry serviceRegistry;
 
-	public XPathActivityConfigurationPanelProvider(XPathActivity activity) {
-		this.activity = activity;
-		initGui();
+	public XPathActivityConfigurationPanelProvider(Activity activity, ServiceRegistry serviceRegistry) {
+		super(activity);
+		this.serviceRegistry = serviceRegistry;
+		initialise();
 	}
 
-	protected void initGui() {
+	@Override
+	protected void initialise() {
+		super.initialise();
 		removeAll();
 		setLayout(new BorderLayout());
 
-		// create view title
-		// ShadedLabel slConfigurationLabel = new
-		// ShadedLabel("Configuration options for this XPath service",
-		// ShadedLabel.ORANGE);
-		// JPanel jpConfigurationLabel = new JPanel(new GridLayout(1,1));
-		// jpConfigurationLabel.add(slConfigurationLabel);
-		// jpConfigurationLabel.setBorder(BorderFactory.createEmptyBorder(10,
-		// 10, 0, 10));
-		// add(jpConfigurationLabel, BorderLayout.NORTH);
-
 		// create actual contents of the config panel
 		this.configPanel = new XPathActivityConfigurationPanel();
 		add(configPanel, BorderLayout.CENTER);
@@ -51,92 +48,63 @@
 		// place the whole configuration panel into a raised area, so that
 		// automatically added 'Apply' / 'Close' buttons visually apply to
 		// the whole of the panel, not just part of it
-		this.setBorder(BorderFactory.createCompoundBorder(BorderFactory
-				.createEmptyBorder(12, 12, 2, 12), BorderFactory
-				.createRaisedBevelBorder()));
-
-		// set preferred size for the panel (otherwise it will be way too small)
-		//this.setMinimumSize(new Dimension(800, 600));
-		//this.setPreferredSize(new Dimension(950, 650));
+		this.setBorder(BorderFactory.createCompoundBorder(
+				BorderFactory.createEmptyBorder(12, 12, 2, 12),
+				BorderFactory.createRaisedBevelBorder()));
 
 		// Populate fields from activity configuration bean
 		refreshConfiguration();
 	}
 
 	/**
-	 * Check that user values in the UI are valid.
-	 */
-	@Override
-	public boolean checkValues() {
-		// the only validity condition is the correctness of the XPath
-		// expression -- so checking that
-		int xpathExpressionStatus = XPathActivityConfigurationBean
-				.validateXPath(this.configPanel.getCurrentXPathExpression());
-
-		// show an explicit warning message to explain the problem
-		if (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_EMPTY) {
-			JOptionPane.showMessageDialog(this,
-					"XPath expression should not be empty", "XPath Activity",
-					JOptionPane.WARNING_MESSAGE);
-		} else if (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_INVALID) {
-			JOptionPane
-					.showMessageDialog(
-							this,
-							"<html><center>XPath expression is invalid - hover the mouse over the XPath status<br>"
-									+ "icon to get more information</center></html>",
-							"XPath Activity", JOptionPane.WARNING_MESSAGE);
-		}
-
-		return (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_VALID);
-	}
-
-	/**
-	 * Return configuration bean generated from user interface last time
-	 * noteConfiguration() was called.
-	 */
-	@Override
-	public XPathActivityConfigurationBean getConfiguration() {
-		// Should already have been made by noteConfiguration()
-		return configBean;
-	}
-
-	/**
-	 * Check if the user has changed the configuration from the original
-	 */
-	@Override
-	public boolean isConfigurationChanged() {
-		boolean xmlDocumentHasNotChanged = (configPanel.getCurrentXMLTree() == null && configBean
-				.getXmlDocument() == null)
-				|| (configPanel.getCurrentXMLTree() != null
-						&& configBean.getXmlDocument() != null && configPanel
-						.getCurrentXMLTree().getDocumentUsedToPopulateTree()
-						.asXML().equals(configBean.getXmlDocument()));
-		boolean xpathExpressionHasNotChanged = configPanel
-				.getCurrentXPathExpression().equals(
-						configBean.getXpathExpression());
-		boolean xpathNamespaceMapHasNotChanged = configPanel
-				.getCurrentXPathNamespaceMap().equals(
-						configBean.getXpathNamespaceMap());
-
-		// true (changed) unless all fields match the originals
-		return !(xmlDocumentHasNotChanged && xpathExpressionHasNotChanged && xpathNamespaceMapHasNotChanged);
-	}
-
-	/**
 	 * Prepare a new configuration bean from the UI, to be returned with
 	 * getConfiguration()
 	 */
 	@Override
 	public void noteConfiguration() {
-		configBean = new XPathActivityConfigurationBean();
-
 		if (configPanel.getCurrentXMLTree() != null) {
-			configBean.setXmlDocument(configPanel.getCurrentXMLTree()
+			setProperty("exampleXmlDocument", configPanel.getCurrentXMLTree()
 					.getDocumentUsedToPopulateTree().asXML());
 		}
-		configBean.setXpathExpression(configPanel.getCurrentXPathExpression());
-		configBean.setXpathNamespaceMap(configPanel
-				.getCurrentXPathNamespaceMap());
+		setProperty("xpathExpression", configPanel.getCurrentXPathExpression());
+
+		Map<String, String> xPathNamespaceMap = configPanel.getCurrentXPathNamespaceMap();
+		if (xPathNamespaceMap.isEmpty()) {
+			json.remove("xpathNamespaceMap");
+		} else {
+			ArrayNode namespaceMapNode = json.arrayNode();
+			for (Entry<String, String> namespaceMapping : xPathNamespaceMap.entrySet()) {
+				namespaceMapNode.addObject().put("prefix", namespaceMapping.getKey()).put("uri", namespaceMapping.getValue());
+			}
+			json.set("xpathNamespaceMap", namespaceMapNode);
+		}
+
+		configureInputPorts(serviceRegistry);
+		configureOutputPorts(serviceRegistry);
+}
+
+	/**
+	 * Check that user values in the UI are valid.
+	 */
+	@Override
+	public boolean checkValues() {
+		// the only validity condition is the correctness of the XPath
+		// expression -- so checking that
+		int xpathExpressionStatus = XPathActivityConfigurationBean.validateXPath(this.configPanel
+				.getCurrentXPathExpression());
+
+		// show an explicit warning message to explain the problem
+		if (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_EMPTY) {
+			JOptionPane.showMessageDialog(this, "XPath expression should not be empty",
+					"XPath Activity", JOptionPane.WARNING_MESSAGE);
+		} else if (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_INVALID) {
+			JOptionPane.showMessageDialog(this,
+					"<html><center>XPath expression is invalid - hover the mouse over the XPath status<br>"
+							+ "icon to get more information</center></html>", "XPath Activity",
+					JOptionPane.WARNING_MESSAGE);
+		}
+
+		return (xpathExpressionStatus == XPathActivityConfigurationBean.XPATH_VALID);
 	}
 
 	/**
@@ -144,17 +112,20 @@
 	 */
 	@Override
 	public void refreshConfiguration() {
-		configBean = activity.getConfiguration();
-
-		if (configBean.getXmlDocument() != null) {
-			configPanel.setSourceXML(configBean.getXmlDocument());
+		if (json.has("exampleXmlDocument")) {
+			configPanel.setSourceXML(getProperty("exampleXmlDocument"));
 			configPanel.parseXML();
 		}
 
-		configPanel.setCurrentXPathExpression(configBean.getXpathExpression());
+		configPanel.setCurrentXPathExpression(getProperty("xpathExpression"));
 
-		configPanel.setCurrentXPathNamespaceMapValues(configBean
-				.getXpathNamespaceMap());
+		Map<String, String> xpathNamespaceMap = new HashMap<>();
+		if (json.has("xpathNamespaceMap")) {
+			for (JsonNode namespaceMapping : json.get("xpathNamespaceMap")) {
+				xpathNamespaceMap.put(namespaceMapping.get("prefix").asText(), namespaceMapping.get("uri").asText());
+			}
+		}
+		configPanel.setCurrentXPathNamespaceMapValues(xpathNamespaceMap);
 		configPanel.reloadNamespaceMappingTableFromLocalMap();
 
 		// if the XML tree was populated, (re-)run the XPath expression
@@ -166,7 +137,7 @@
 			// discard the first 'leg', as it's a side effect of
 			// "String.split()" -
 			// non-existent string to the left of the first "/"
-			String[] xpathLegs = configBean.getXpathExpression().split("/");
+			String[] xpathLegs = getProperty("xpathExpression").split("/");
 			List<String> xpathLegList = new ArrayList<String>();
 			for (int i = 1; i < xpathLegs.length; i++) {
 				xpathLegList.add("/" + xpathLegs[i]);
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
index 0579ff7..4e68948 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
@@ -3,39 +3,50 @@
 import java.awt.Frame;
 import java.awt.event.ActionEvent;
 
+import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.file.FileManager;
 import net.sf.taverna.t2.workbench.ui.actions.activity.ActivityConfigurationAction;
 import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationDialog;
+import uk.org.taverna.commons.services.ServiceRegistry;
+import uk.org.taverna.scufl2.api.activity.Activity;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
-import net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean;
-
-@SuppressWarnings("serial")
 /**
  * @author Sergejs Aleksejevs
+ * @author David Withers
  */
-public class XPathActivityConfigureAction extends ActivityConfigurationAction<XPathActivity, XPathActivityConfigurationBean>
-{
+@SuppressWarnings("serial")
+public class XPathActivityConfigureAction extends ActivityConfigurationAction {
 
-	public XPathActivityConfigureAction(XPathActivity activity, Frame owner) {
-		super(activity);
+	private final EditManager editManager;
+	private final FileManager fileManager;
+	private final ServiceRegistry serviceRegistry;
+
+	public XPathActivityConfigureAction(Activity activity, Frame owner,
+			EditManager editManager, FileManager fileManager,
+			ActivityIconManager activityIconManager,
+			ServiceDescriptionRegistry serviceDescriptionRegistry, ServiceRegistry serviceRegistry) {
+		super(activity, activityIconManager, serviceDescriptionRegistry);
+		this.editManager = editManager;
+		this.fileManager = fileManager;
+		this.serviceRegistry = serviceRegistry;
 	}
 
-	@SuppressWarnings("unchecked")
-	public void actionPerformed(ActionEvent e)
-	{
-		ActivityConfigurationDialog<XPathActivity,XPathActivityConfigurationBean> currentDialog =
-		  ActivityConfigurationAction.getDialog(getActivity());
-		
+	public void actionPerformed(ActionEvent e) {
+		ActivityConfigurationDialog currentDialog = ActivityConfigurationAction.getDialog(getActivity());
+
 		if (currentDialog != null) {
 			currentDialog.toFront();
 			return;
 		}
-		
-		XPathActivityConfigurationPanelProvider panel = new XPathActivityConfigurationPanelProvider(getActivity());
-		ActivityConfigurationDialog<XPathActivity, XPathActivityConfigurationBean> dialog =
-		  new ActivityConfigurationDialog<XPathActivity, XPathActivityConfigurationBean>(getActivity(), panel);
 
-		ActivityConfigurationAction.setDialog(getActivity(), dialog);
+		XPathActivityConfigurationPanelProvider panel = new XPathActivityConfigurationPanelProvider(
+				getActivity(), serviceRegistry);
+		ActivityConfigurationDialog dialog = new ActivityConfigurationDialog(
+				getActivity(), panel, editManager);
+
+		ActivityConfigurationAction.setDialog(getActivity(), dialog, fileManager);
 	}
 
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/ConfigureXPathActivityMenuAction.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/ConfigureXPathActivityMenuAction.java
index 4abb800..6695dc9 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/ConfigureXPathActivityMenuAction.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/ConfigureXPathActivityMenuAction.java
@@ -2,35 +2,64 @@
 
 import javax.swing.Action;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
 import net.sf.taverna.t2.activities.xpath.ui.config.XPathActivityConfigureAction;
+import net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathTemplateService;
+import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
 import net.sf.taverna.t2.workbench.activitytools.AbstractConfigureActivityMenuAction;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.file.FileManager;
+import uk.org.taverna.commons.services.ServiceRegistry;
 
 /**
- * This action is responsible for enabling the contextual menu entry
- * on processors that perform XPathActivity'ies.
- * 
- * NB! As a side-effect this also enables the pop-up with for configuration
- * of the processor when it is added to the workflow from the Service Panel. 
- * 
+ * This action is responsible for enabling the contextual menu entry on processors that perform
+ * XPathActivity'ies.
+ * NB! As a side-effect this also enables the pop-up with for configuration of the processor when it
+ * is added to the workflow from the Service Panel.
+ *
  * @author Sergejs Aleksejevs
+ * @author David Withers
  */
-public class ConfigureXPathActivityMenuAction extends
-    AbstractConfigureActivityMenuAction<XPathActivity>
-{
+public class ConfigureXPathActivityMenuAction extends AbstractConfigureActivityMenuAction {
 
-  public ConfigureXPathActivityMenuAction() {
-    super(XPathActivity.class);
-  }
-  
-  @Override
-  protected Action createAction()
-  {
-    XPathActivityConfigureAction configAction = new XPathActivityConfigureAction(
-        findActivity(), getParentFrame());
-    configAction.putValue(Action.NAME, "Configure XPath service");
-    addMenuDots(configAction);
-    return configAction;
-  }
+	private EditManager editManager;
+	private FileManager fileManager;
+	private ActivityIconManager activityIconManager;
+	private ServiceDescriptionRegistry serviceDescriptionRegistry;
+	private ServiceRegistry serviceRegistry;
+
+	public ConfigureXPathActivityMenuAction() {
+		super(XPathTemplateService.ACTIVITY_TYPE);
+	}
+
+	@Override
+	protected Action createAction() {
+		XPathActivityConfigureAction configAction = new XPathActivityConfigureAction(
+				findActivity(), getParentFrame(), editManager, fileManager, activityIconManager,
+				serviceDescriptionRegistry, serviceRegistry);
+		configAction.putValue(Action.NAME, "Configure XPath service");
+		addMenuDots(configAction);
+		return configAction;
+	}
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setFileManager(FileManager fileManager) {
+		this.fileManager = fileManager;
+	}
+
+	public void setActivityIconManager(ActivityIconManager activityIconManager) {
+		this.activityIconManager = activityIconManager;
+	}
+
+	public void setServiceDescriptionRegistry(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+	}
+
+	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
+		this.serviceRegistry = serviceRegistry;
+	}
 
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextViewFactory.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextViewFactory.java
index 034d500..355ab8d 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextViewFactory.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextViewFactory.java
@@ -3,25 +3,57 @@
 import java.util.Arrays;
 import java.util.List;
 
+import net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathTemplateService;
+import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.file.FileManager;
 import net.sf.taverna.t2.workbench.ui.views.contextualviews.ContextualView;
 import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory;
-
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
+import uk.org.taverna.commons.services.ServiceRegistry;
+import uk.org.taverna.scufl2.api.activity.Activity;
 
 /**
- * 
  * @author Sergejs Aleksejevs
  */
-public class XPathActivityMainContextViewFactory implements
-		ContextualViewFactory<XPathActivity>
-{
+public class XPathActivityMainContextViewFactory implements ContextualViewFactory<Activity> {
+
+	private EditManager editManager;
+	private FileManager fileManager;
+	private ActivityIconManager activityIconManager;
+	private ServiceDescriptionRegistry serviceDescriptionRegistry;
+	private ServiceRegistry serviceRegistry;
 
 	public boolean canHandle(Object selection) {
-		return selection instanceof XPathActivity;
+		return selection instanceof Activity
+				&& ((Activity) selection).getType()
+						.equals(XPathTemplateService.ACTIVITY_TYPE);
 	}
 
-	public List<ContextualView> getViews(XPathActivity selection) {
-		return Arrays.<ContextualView>asList(new XPathActivityMainContextualView(selection));
+	public List<ContextualView> getViews(Activity selection) {
+		return Arrays.<ContextualView> asList(new XPathActivityMainContextualView(selection,
+				editManager, fileManager, activityIconManager, serviceDescriptionRegistry,
+				serviceRegistry));
 	}
-	
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setFileManager(FileManager fileManager) {
+		this.fileManager = fileManager;
+	}
+
+	public void setActivityIconManager(ActivityIconManager activityIconManager) {
+		this.activityIconManager = activityIconManager;
+	}
+
+	public void setServiceDescriptionRegistry(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+	}
+
+	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
+		this.serviceRegistry = serviceRegistry;
+	}
+
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextualView.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextualView.java
index 8d65f81..d872228 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextualView.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/contextualview/XPathActivityMainContextualView.java
@@ -10,7 +10,6 @@
 import java.awt.Insets;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.Map;
 
 import javax.swing.Action;
 import javax.swing.BorderFactory;
@@ -22,124 +21,142 @@
 import javax.swing.JTextField;
 import javax.swing.table.DefaultTableModel;
 
-import net.sf.taverna.t2.workbench.ui.views.contextualviews.ContextualView;
-
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
-import net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean;
 import net.sf.taverna.t2.activities.xpath.ui.config.XPathActivityConfigureAction;
+import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.file.FileManager;
+import net.sf.taverna.t2.workbench.ui.views.contextualviews.ContextualView;
+import uk.org.taverna.commons.services.ServiceRegistry;
+import uk.org.taverna.scufl2.api.activity.Activity;
+import uk.org.taverna.scufl2.api.common.Scufl2Tools;
+import uk.org.taverna.scufl2.api.configurations.Configuration;
 
-@SuppressWarnings("serial")
+import com.fasterxml.jackson.databind.JsonNode;
+
 /**
- * 
+ *
  * @author Sergejs Aleksejevs
+ * @author David Withers
  */
-public class XPathActivityMainContextualView extends ContextualView
-{
-  private XPathActivityMainContextualView thisContextualView;
-	private final XPathActivity activity;
-	
+@SuppressWarnings("serial")
+public class XPathActivityMainContextualView extends ContextualView {
+
+	private final Scufl2Tools scufl2Tools = new Scufl2Tools();
+
+	private XPathActivityMainContextualView thisContextualView;
+
+	private final Activity activity;
+
 	private JPanel jpMainPanel;
 	private JTextField tfXPathExpression;
-	
+
 	private DefaultTableModel xpathNamespaceMappingsTableModel;
 	private JTable jtXPathNamespaceMappings;
 	private JScrollPane spXPathNamespaceMappings;
-	
-	
-	public XPathActivityMainContextualView(XPathActivity activity) {
-	  this.thisContextualView = this;
+	private final EditManager editManager;
+	private final FileManager fileManager;
+	private final ActivityIconManager activityIconManager;
+	private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+	private final ServiceRegistry serviceRegistry;
+
+	public XPathActivityMainContextualView(Activity activity, EditManager editManager,
+			FileManager fileManager, ActivityIconManager activityIconManager,
+			ServiceDescriptionRegistry serviceDescriptionRegistry, ServiceRegistry serviceRegistry) {
+		this.editManager = editManager;
+		this.fileManager = fileManager;
+		this.activityIconManager = activityIconManager;
+		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+		this.serviceRegistry = serviceRegistry;
+		this.thisContextualView = this;
 		this.activity = activity;
 		initView();
 	}
-	
-	
+
 	@Override
-	public JComponent getMainFrame()
-	{
+	public JComponent getMainFrame() {
 		jpMainPanel = new JPanel(new GridBagLayout());
-		jpMainPanel.setBorder(
-		    BorderFactory.createCompoundBorder(
-            BorderFactory.createEmptyBorder(4, 2, 4, 2),
-            BorderFactory.createEmptyBorder()
-//            BorderFactory.createLineBorder(ColourManager.getInstance().getPreferredColour(XPathActivity.class.getCanonicalName()), 2)  // makes a thin border with the colour of the processor
-        ));
-		
+		jpMainPanel.setBorder(BorderFactory.createCompoundBorder(
+				BorderFactory.createEmptyBorder(4, 2, 4, 2), BorderFactory.createEmptyBorder()));
+
 		GridBagConstraints c = new GridBagConstraints();
 		c.fill = GridBagConstraints.HORIZONTAL;
 		c.anchor = GridBagConstraints.WEST;
 		c.weighty = 0;
-		
-		
+
 		// --- XPath Expression ---
-		
+
 		c.gridx = 0;
 		c.gridy = 0;
 		c.insets = new Insets(5, 5, 5, 5);
 		JLabel jlXPathExpression = new JLabel("XPath Expression:");
 		jlXPathExpression.setFont(jlXPathExpression.getFont().deriveFont(Font.BOLD));
 		jpMainPanel.add(jlXPathExpression, c);
-		
+
 		c.gridx++;
 		c.weightx = 1.0;
 		tfXPathExpression = new JTextField();
 		tfXPathExpression.setEditable(false);
 		jpMainPanel.add(tfXPathExpression, c);
-		
-		
+
 		// --- Label to Show/Hide Mapping Table ---
-    
-		
+
 		final JLabel jlShowHideNamespaceMappings = new JLabel("Show namespace mappings...");
-    jlShowHideNamespaceMappings.setForeground(Color.BLUE);
-    jlShowHideNamespaceMappings.setCursor(new Cursor(Cursor.HAND_CURSOR));
-    jlShowHideNamespaceMappings.addMouseListener(new MouseAdapter() {
-      public void mouseClicked(MouseEvent e) {
-        spXPathNamespaceMappings.setVisible(!spXPathNamespaceMappings.isVisible());
-        jlShowHideNamespaceMappings.setText((spXPathNamespaceMappings.isVisible() ? "Hide" : "Show") + " namespace mappings...");
-        thisContextualView.revalidate();
-      }
-    });
-    
-    c.gridx = 0;
-    c.gridy++;
-    c.gridwidth = 2;
-    c.weightx = 1.0;
-    c.weighty = 0;
-    c.fill = GridBagConstraints.HORIZONTAL;
-    jpMainPanel.add(jlShowHideNamespaceMappings, c);
-		
-		
-    // --- Namespace Mapping Table ---
-		
+		jlShowHideNamespaceMappings.setForeground(Color.BLUE);
+		jlShowHideNamespaceMappings.setCursor(new Cursor(Cursor.HAND_CURSOR));
+		jlShowHideNamespaceMappings.addMouseListener(new MouseAdapter() {
+			public void mouseClicked(MouseEvent e) {
+				spXPathNamespaceMappings.setVisible(!spXPathNamespaceMappings.isVisible());
+				jlShowHideNamespaceMappings.setText((spXPathNamespaceMappings.isVisible() ? "Hide"
+						: "Show") + " namespace mappings...");
+				thisContextualView.revalidate();
+			}
+		});
+
+		c.gridx = 0;
+		c.gridy++;
+		c.gridwidth = 2;
+		c.weightx = 1.0;
+		c.weighty = 0;
+		c.fill = GridBagConstraints.HORIZONTAL;
+		jpMainPanel.add(jlShowHideNamespaceMappings, c);
+
+		// --- Namespace Mapping Table ---
+
 		xpathNamespaceMappingsTableModel = new DefaultTableModel() {
-      /**
-       * No cells should be editable
-       */
-      public boolean isCellEditable(int rowIndex,int columnIndex) {
-        return (false);
-      }
-    };
-    xpathNamespaceMappingsTableModel.addColumn("Namespace Prefix");
-    xpathNamespaceMappingsTableModel.addColumn("Namespace URI");
-		
+			/**
+			 * No cells should be editable
+			 */
+			public boolean isCellEditable(int rowIndex, int columnIndex) {
+				return (false);
+			}
+		};
+		xpathNamespaceMappingsTableModel.addColumn("Namespace Prefix");
+		xpathNamespaceMappingsTableModel.addColumn("Namespace URI");
+
 		jtXPathNamespaceMappings = new JTable();
 		jtXPathNamespaceMappings.setModel(xpathNamespaceMappingsTableModel);
 		jtXPathNamespaceMappings.setPreferredScrollableViewportSize(new Dimension(200, 90));
-		// TODO - next line is to be enabled when Taverna is migrated to Java 1.6; for now it's fine to run without this
-    //   jtXPathNamespaceMappings.setFillsViewportHeight(true);  // makes sure that when the dedicated area is larger than the table, the latter is stretched vertically to fill the empty space
-		
-		jtXPathNamespaceMappings.getColumnModel().getColumn(0).setPreferredWidth(20);  // set relative sizes of columns
+		// TODO - next line is to be enabled when Taverna is migrated to Java
+		// 1.6; for now it's fine to run without this
+		// jtXPathNamespaceMappings.setFillsViewportHeight(true); // makes sure
+		// that when the dedicated area is larger than the table, the latter is
+		// stretched vertically to fill the empty space
+
+		jtXPathNamespaceMappings.getColumnModel().getColumn(0).setPreferredWidth(20); // set
+																						// relative
+																						// sizes of
+																						// columns
 		jtXPathNamespaceMappings.getColumnModel().getColumn(1).setPreferredWidth(300);
-		
+
 		c.gridy++;
 		spXPathNamespaceMappings = new JScrollPane(jtXPathNamespaceMappings);
 		spXPathNamespaceMappings.setVisible(false);
 		jpMainPanel.add(spXPathNamespaceMappings, c);
-		
-		
+
 		// populate the view with values
 		refreshView();
-		
+
 		return jpMainPanel;
 	}
 
@@ -149,7 +166,6 @@
 	 * views (even when this contextual view is collapsed).
 	 */
 	public String getViewTitle() {
-		XPathActivityConfigurationBean configuration = activity.getConfiguration();
 		return "XPath Service Details";
 	}
 
@@ -157,18 +173,21 @@
 	 * Typically called when the activity configuration has changed.
 	 */
 	@Override
-	public void refreshView()
-	{
-		XPathActivityConfigurationBean configBean = activity.getConfiguration();
-		
+	public void refreshView() {
+		Configuration configuration = scufl2Tools.configurationFor(activity, activity.getParent());
+		JsonNode json = configuration.getJson();
+
 		// Set XPath Expression
-		tfXPathExpression.setText("" + configBean.getXpathExpression());
-		
+		tfXPathExpression.setText(json.get("xpathExpression").asText());
+
 		// Populate Namespace Mappings
 		xpathNamespaceMappingsTableModel.getDataVector().removeAllElements();
-    for (Map.Entry<String,String> mapping : configBean.getXpathNamespaceMap().entrySet()) {
-      xpathNamespaceMappingsTableModel.addRow(new Object[] {mapping.getKey(), mapping.getValue()});
-    }
+		if (json.has("xpathNamespaceMap")) {
+			for (JsonNode mapping : json.get("xpathNamespaceMap")) {
+				xpathNamespaceMappingsTableModel.addRow(new Object[] {
+						mapping.get("prefix").asText(), mapping.get("uri").asText() });
+			}
+		}
 	}
 
 	/**
@@ -179,11 +198,12 @@
 		// want to be on top, as it's the main contextual view for this activity
 		return 100;
 	}
-	
+
 	@Override
 	public Action getConfigureAction(final Frame owner) {
-	  // "Configure" button appears because of this action being returned
-		return new XPathActivityConfigureAction(activity, owner);
+		// "Configure" button appears because of this action being returned
+		return new XPathActivityConfigureAction(activity, owner, editManager, fileManager,
+				activityIconManager, serviceDescriptionRegistry, serviceRegistry);
 	}
 
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateAction.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateAction.java
index 214d6cd..a80696d 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateAction.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateAction.java
@@ -1,19 +1,19 @@
 /*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
+ * Copyright (C) 2007-2009 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
@@ -21,30 +21,25 @@
 package net.sf.taverna.t2.activities.xpath.ui.menu;
 
 import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
 import java.net.URI;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.JComponent;
-import javax.swing.KeyStroke;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
 import net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathTemplateService;
 import net.sf.taverna.t2.ui.menu.AbstractContextualMenuAction;
+import net.sf.taverna.t2.ui.menu.MenuManager;
 import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
-import net.sf.taverna.t2.workbench.file.FileManager;
+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 net.sf.taverna.t2.workflowmodel.Dataflow;
-
-import org.apache.log4j.Logger;
+import uk.org.taverna.commons.services.ServiceRegistry;
+import uk.org.taverna.scufl2.api.core.Workflow;
 
 /**
  * An action to add a REST activity + a wrapping processor to the workflow.
- * 
+ *
  * @author Alex Nenadic
- * 
  */
 @SuppressWarnings("serial")
 public class AddXPathTemplateAction extends AbstractContextualMenuAction {
@@ -54,8 +49,15 @@
 	private static final URI insertSection = URI
 			.create("http://taverna.sf.net/2009/contextMenu/insert");
 
-	private static Logger logger = Logger
-			.getLogger(AddXPathTemplateAction.class);
+	private EditManager editManager;
+
+	private MenuManager menuManager;
+
+	private SelectionManager selectionManager;
+
+	private ActivityIconManager activityIconManager;
+
+	private ServiceRegistry serviceRegistry;
 
 	public AddXPathTemplateAction() {
 		super(insertSection, 1000);
@@ -63,8 +65,7 @@
 
 	@Override
 	public boolean isEnabled() {
-		return super.isEnabled()
-				&& getContextualSelection().getSelection() instanceof Dataflow;
+		return super.isEnabled() && getContextualSelection().getSelection() instanceof Workflow;
 	}
 
 	@Override
@@ -72,20 +73,38 @@
 
 		return new AddXPathAction();
 	}
-	
+
 	protected class AddXPathAction extends AbstractAction {
-		AddXPathAction () {
-			super (ADD_XPATH, ActivityIconManager.getInstance().iconForActivity(
-						new XPathActivity()));
+		AddXPathAction() {
+			super(ADD_XPATH, activityIconManager
+					.iconForActivity(XPathTemplateService.ACTIVITY_TYPE));
 		}
 
 		public void actionPerformed(ActionEvent e) {
-			Dataflow workflow = FileManager.getInstance()
-			.getCurrentDataflow();
 
-	WorkflowView.importServiceDescription(XPathTemplateService.getServiceDescription(),
-			false);
+			WorkflowView.importServiceDescription(XPathTemplateService.getServiceDescription(),
+					false, editManager, menuManager, selectionManager, serviceRegistry);
 		}
 	}
 
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setMenuManager(MenuManager menuManager) {
+		this.menuManager = menuManager;
+	}
+
+	public void setSelectionManager(SelectionManager selectionManager) {
+		this.selectionManager = selectionManager;
+	}
+
+	public void setActivityIconManager(ActivityIconManager activityIconManager) {
+		this.activityIconManager = activityIconManager;
+	}
+
+	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
+		this.serviceRegistry = serviceRegistry;
+	}
+
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateMenuAction.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateMenuAction.java
index c8e12d4..9132110 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateMenuAction.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/menu/AddXPathTemplateMenuAction.java
@@ -1,19 +1,19 @@
 /*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
+ * Copyright (C) 2007-2009 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
@@ -25,62 +25,93 @@
 import java.awt.event.KeyEvent;
 import java.net.URI;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.KeyStroke;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
 import net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathTemplateService;
 import net.sf.taverna.t2.ui.menu.AbstractMenuAction;
+import net.sf.taverna.t2.ui.menu.DesignOnlyAction;
+import net.sf.taverna.t2.ui.menu.MenuManager;
 import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+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 net.sf.taverna.t2.workbench.views.graph.actions.DesignOnlyAction;
-import net.sf.taverna.t2.workbench.views.graph.menu.InsertMenu;
-
-import org.apache.log4j.Logger;
+import uk.org.taverna.commons.services.ServiceRegistry;
 
 /**
  * An action to add a REST activity + a wrapping processor to the workflow.
- * 
+ *
  * @author Alex Nenadic
  * @author alanrw
- * 
  */
 @SuppressWarnings("serial")
 public class AddXPathTemplateMenuAction extends AbstractMenuAction {
 
 	private static final String ADD_XPATH = "XPath";
 
-	private static final URI ADD_XPATH_URI = URI
-	.create("http://taverna.sf.net/2008/t2workbench/menu#graphMenuAddXPath");
+	private static final URI INSERT = URI
+			.create("http://taverna.sf.net/2008/t2workbench/menu#insert");
 
-	private static Logger logger = Logger
-			.getLogger(AddXPathTemplateMenuAction.class);
+	private static final URI ADD_XPATH_URI = URI
+			.create("http://taverna.sf.net/2008/t2workbench/menu#graphMenuAddXPath");
+
+	private EditManager editManager;
+
+	private MenuManager menuManager;
+
+	private SelectionManager selectionManager;
+
+	private ActivityIconManager activityIconManager;
+
+	private ServiceRegistry serviceRegistry;
 
 	public AddXPathTemplateMenuAction() {
-		super(InsertMenu.INSERT, 1000, ADD_XPATH_URI);
+		super(INSERT, 1000, ADD_XPATH_URI);
 	}
 
 	@Override
 	protected Action createAction() {
-
 		return new AddXPathMenuAction();
 	}
-	
-	protected class AddXPathMenuAction extends DesignOnlyAction {
-		AddXPathMenuAction () {
-			super ();
-			putValue(SMALL_ICON, ActivityIconManager.getInstance().iconForActivity(
-					new XPathActivity()));
-			putValue(NAME, ADD_XPATH);	
-			putValue(SHORT_DESCRIPTION, "XPath service");	
-			putValue(Action.ACCELERATOR_KEY,
-					KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK));
+
+	protected class AddXPathMenuAction extends AbstractAction implements DesignOnlyAction {
+		AddXPathMenuAction() {
+			super();
+			putValue(SMALL_ICON,
+					activityIconManager.iconForActivity(XPathTemplateService.ACTIVITY_TYPE));
+			putValue(NAME, ADD_XPATH);
+			putValue(SHORT_DESCRIPTION, "XPath service");
+			putValue(
+					Action.ACCELERATOR_KEY,
+					KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.SHIFT_DOWN_MASK
+							| InputEvent.ALT_DOWN_MASK));
 		}
 
 		public void actionPerformed(ActionEvent e) {
 			WorkflowView.importServiceDescription(XPathTemplateService.getServiceDescription(),
-			false);
+					false, editManager, menuManager, selectionManager, serviceRegistry);
 		}
 	}
 
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setMenuManager(MenuManager menuManager) {
+		this.menuManager = menuManager;
+	}
+
+	public void setSelectionManager(SelectionManager selectionManager) {
+		this.selectionManager = selectionManager;
+	}
+
+	public void setActivityIconManager(ActivityIconManager activityIconManager) {
+		this.activityIconManager = activityIconManager;
+	}
+
+	public void setServiceRegistry(ServiceRegistry serviceRegistry) {
+		this.serviceRegistry = serviceRegistry;
+	}
+
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathActivityIcon.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathActivityIcon.java
index bebe007..2251efb 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathActivityIcon.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathActivityIcon.java
@@ -1,93 +1,86 @@
 package net.sf.taverna.t2.activities.xpath.ui.servicedescription;
+
 import java.awt.Color;
+import java.net.URI;
 
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
 import net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI;
-import net.sf.taverna.t2.workbench.ui.impl.configuration.colour.ColourManager;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
+import net.sf.taverna.t2.workbench.configuration.colour.ColourManager;
 
 /**
- * 
  * @author Sergejs Aleksejevs
  */
-public class XPathActivityIcon implements ActivityIconSPI
-{
-  private static final Color PROCESSOR_COLOUR = Color.decode("#E6FF5E");
-  
-  
-  // --- LOCATIONS OF ICONS USED IN THE XPath ACTIVITY ---
-  
-  private static final String FAMFAMFAM_SILK_PATH = "famfamfam_silk/";
-  private static final String FOLDS_PATH = "folds/";
-  
-  public static final String XPATH_ACTIVITY_ICON = FAMFAMFAM_SILK_PATH + "page_white_code.png";
-  public static final String XPATH_ACTIVITY_CONFIGURATION_PARSE_XML_ICON = "arrow_right.png";
-  
-  public static final String XML_TREE_ROOT_ICON = FAMFAMFAM_SILK_PATH + "page_white_code.png";
-  public static final String XML_TREE_NODE_ICON = FAMFAMFAM_SILK_PATH + "tag.png";
-  public static final String XML_TREE_ATTRIBUTE_ICON = "xpath_attribute.png";
-  
-  public static final String XML_TREE_EXPAND_ALL_ICON = FAMFAMFAM_SILK_PATH + "text_linespacing.png";
-  public static final String XML_TREE_COLLAPSE_ALL_ICON = FAMFAMFAM_SILK_PATH + "text_linespacing (collapse).png";
-  
-  public static final String XPATH_STATUS_OK_ICON = FAMFAMFAM_SILK_PATH + "accept.png";
-  public static final String XPATH_STATUS_ERROR_ICON = FAMFAMFAM_SILK_PATH + "exclamation.png";
-  public static final String XPATH_STATUS_UNKNOWN_ICON = FAMFAMFAM_SILK_PATH + "help.png";
-  
-  public static final String FOLD_ICON = FOLDS_PATH + "fold.png";
-  public static final String UNFOLD_ICON = FOLDS_PATH + "unfold.png";
-  
-  // ------
-  
-  private static ImageIcon icon;
-  
-  
-  static {
-    // set colour for XPath processors in the workflow diagram
-    ColourManager.getInstance().setPreferredColour(
-        XPathActivity.class.getCanonicalName(), PROCESSOR_COLOUR);
-  }
-  
-  public int canProvideIconScore(Activity<?> activity)
-  {
-    if (activity.getClass().getName().equals(XPathActivity.class.getName()))
-      return DEFAULT_ICON + 1;
-    else
-      return NO_ICON;
-  }
+public class XPathActivityIcon implements ActivityIconSPI {
+	private static final Color PROCESSOR_COLOUR = Color.decode("#E6FF5E");
 
-  public Icon getIcon(Activity<?> activity) {
-    return (getXPathActivityIcon());
-  }
+	// --- LOCATIONS OF ICONS USED IN THE XPath ACTIVITY ---
 
-  public static Icon getXPathActivityIcon() {
-    if (icon == null) {
-      synchronized(XPathActivityIcon.class) {
-        if (icon == null) {
-          try {
-            icon = new ImageIcon(XPathActivityIcon.class.getResource(XPATH_ACTIVITY_ICON));
-          }
-          catch (NullPointerException e) {
-            /* icon wasn't found - do nothing, but no icon will be available */
-          }
-        }
-      }
-    }
-    return (icon);
-  }
-  
-  
-  public static Icon getIconById(String iconID) {
-    try {
-      return (new ImageIcon(XPathActivityIcon.class.getResource(iconID)));
-    }
-    catch (NullPointerException e) {
-      // requested icon wasn't found - just return null
-      return (null);
-    }
-  }
+	private static final String FAMFAMFAM_SILK_PATH = "famfamfam_silk/";
+	private static final String FOLDS_PATH = "folds/";
+
+	public static final String XPATH_ACTIVITY_ICON = FAMFAMFAM_SILK_PATH + "page_white_code.png";
+	public static final String XPATH_ACTIVITY_CONFIGURATION_PARSE_XML_ICON = "arrow_right.png";
+
+	public static final String XML_TREE_ROOT_ICON = FAMFAMFAM_SILK_PATH + "page_white_code.png";
+	public static final String XML_TREE_NODE_ICON = FAMFAMFAM_SILK_PATH + "tag.png";
+	public static final String XML_TREE_ATTRIBUTE_ICON = "xpath_attribute.png";
+
+	public static final String XML_TREE_EXPAND_ALL_ICON = FAMFAMFAM_SILK_PATH
+			+ "text_linespacing.png";
+	public static final String XML_TREE_COLLAPSE_ALL_ICON = FAMFAMFAM_SILK_PATH
+			+ "text_linespacing (collapse).png";
+
+	public static final String XPATH_STATUS_OK_ICON = FAMFAMFAM_SILK_PATH + "accept.png";
+	public static final String XPATH_STATUS_ERROR_ICON = FAMFAMFAM_SILK_PATH + "exclamation.png";
+	public static final String XPATH_STATUS_UNKNOWN_ICON = FAMFAMFAM_SILK_PATH + "help.png";
+
+	public static final String FOLD_ICON = FOLDS_PATH + "fold.png";
+	public static final String UNFOLD_ICON = FOLDS_PATH + "unfold.png";
+
+	// ------
+
+	private static ImageIcon icon;
+
+	public int canProvideIconScore(URI activityType) {
+		if (XPathTemplateService.ACTIVITY_TYPE.equals(activityType))
+			return DEFAULT_ICON + 1;
+		else
+			return NO_ICON;
+	}
+
+	public Icon getIcon(URI activityType) {
+		return getXPathActivityIcon();
+	}
+
+	public static Icon getXPathActivityIcon() {
+		if (icon == null) {
+			synchronized (XPathActivityIcon.class) {
+				if (icon == null) {
+					try {
+						icon = new ImageIcon(
+								XPathActivityIcon.class.getResource(XPATH_ACTIVITY_ICON));
+					} catch (NullPointerException e) {
+						/* icon wasn't found - do nothing, but no icon will be available */
+					}
+				}
+			}
+		}
+		return (icon);
+	}
+
+	public static Icon getIconById(String iconID) {
+		try {
+			return (new ImageIcon(XPathActivityIcon.class.getResource(iconID)));
+		} catch (NullPointerException e) {
+			// requested icon wasn't found - just return null
+			return (null);
+		}
+	}
+
+	public void setColourManager(ColourManager colourManager) {
+		colourManager.setPreferredColour(XPathTemplateService.ACTIVITY_TYPE.toString(), PROCESSOR_COLOUR);
+	}
 
 }
diff --git a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathTemplateService.java b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathTemplateService.java
index b23d5cd..d55235d 100644
--- a/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathTemplateService.java
+++ b/src/main/java/net/sf/taverna/t2/activities/xpath/ui/servicedescription/XPathTemplateService.java
@@ -1,67 +1,57 @@
 package net.sf.taverna.t2.activities.xpath.ui.servicedescription;
 
+import java.net.URI;
+
 import javax.swing.Icon;
 
-import net.sf.taverna.t2.activities.xpath.XPathActivity;
-import net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean;
 import net.sf.taverna.t2.servicedescriptions.AbstractTemplateService;
 import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
+import uk.org.taverna.scufl2.api.configurations.Configuration;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 /**
- * 
  * @author Sergejs Aleksejevs
+ * @author David Withers
  */
-public class XPathTemplateService extends AbstractTemplateService<XPathActivityConfigurationBean>
-{
-  public XPathTemplateService ()
-  {
-    super();
-    /*
-      // TODO - re-enable this if it is necessary to add another folder inside "Service templates" in the Service Panel
-      templateService = new AbstractTemplateService.TemplateServiceDescription() {
-        public List<String> getPath() {
-            return Arrays.asList(SERVICE_TEMPLATES, "XPath");
-        }
-      };
-    */
-  }
-  
-  @Override
-  public Class<XPathActivity> getActivityClass() {
-    return XPathActivity.class;
-  }
-  
-  @Override
-  /**
-   * Default values for this template service are provided in this method.
-   */
-  public XPathActivityConfigurationBean getActivityConfiguration()
-  {
-    return (XPathActivityConfigurationBean.getDefaultInstance());
-  }
-  
-  @Override
-  public Icon getIcon() {
-    return XPathActivityIcon.getXPathActivityIcon();
-  }
-  
-  public String getName() {
-    return "XPath Service";
-  }
-  
-  public String getDescription() {
-    return "Service for point-and-click creation of XPath expressions for XML data";
-  }
-  
-	@SuppressWarnings("unchecked")
+public class XPathTemplateService extends AbstractTemplateService {
+
+	public static final URI ACTIVITY_TYPE = URI.create("http://ns.taverna.org.uk/2010/activity/xpath");
+
+	@Override
+	public URI getActivityType() {
+		return ACTIVITY_TYPE;
+	}
+
+	@Override
+	public Configuration getActivityConfiguration() {
+		Configuration configuration = new Configuration();
+		configuration.setType(ACTIVITY_TYPE.resolve("#Config"));
+		ObjectNode json = (ObjectNode) configuration.getJson();
+		json.put("xpathExpression", "/");
+		return configuration;
+	}
+
+	@Override
+	public Icon getIcon() {
+		return XPathActivityIcon.getXPathActivityIcon();
+	}
+
+	public String getName() {
+		return "XPath";
+	}
+
+	public String getDescription() {
+		return "Service for point-and-click creation of XPath expressions for XML data";
+	}
+
 	public static ServiceDescription getServiceDescription() {
 		XPathTemplateService gts = new XPathTemplateService();
 		return gts.templateService;
 	}
 
+	public String getId() {
+		return "http://www.taverna.org.uk/2010/services/xpath";
+	}
 
-  public String getId() {
-    return "http://www.taverna.org.uk/2010/services/xpath";
-  }
-  
 }
diff --git a/src/main/resources/META-INF/spring/xpath-activity-ui-context-osgi.xml b/src/main/resources/META-INF/spring/xpath-activity-ui-context-osgi.xml
new file mode 100644
index 0000000..1e53ea6
--- /dev/null
+++ b/src/main/resources/META-INF/spring/xpath-activity-ui-context-osgi.xml
@@ -0,0 +1,28 @@
+<?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="XPathActivityIcon" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI" />
+
+	<service ref="XPathTemplateService" interface="net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider" />
+
+	<service ref="ConfigureXPathActivityMenuAction" auto-export="interfaces" />
+	<service ref="AddXPathTemplateAction" auto-export="interfaces" />
+	<service ref="AddXPathTemplateMenuAction" auto-export="interfaces" />
+
+	<service ref="XPathActivityMainContextViewFactory" interface="net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory" />
+
+	<reference id="editManager" interface="net.sf.taverna.t2.workbench.edits.EditManager" />
+	<reference id="fileManager" interface="net.sf.taverna.t2.workbench.file.FileManager" />
+	<reference id="menuManager" interface="net.sf.taverna.t2.ui.menu.MenuManager" />
+	<reference id="selectionManager" interface="net.sf.taverna.t2.workbench.selection.SelectionManager" />
+	<reference id="activityIconManager" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconManager" />
+	<reference id="colourManager" interface="net.sf.taverna.t2.workbench.configuration.colour.ColourManager" />
+	<reference id="serviceDescriptionRegistry" interface="net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry" />
+	<reference id="serviceRegistry" interface="uk.org.taverna.commons.services.ServiceRegistry" />
+
+</beans:beans>
diff --git a/src/main/resources/META-INF/spring/xpath-activity-ui-context.xml b/src/main/resources/META-INF/spring/xpath-activity-ui-context.xml
new file mode 100644
index 0000000..0116b2e
--- /dev/null
+++ b/src/main/resources/META-INF/spring/xpath-activity-ui-context.xml
@@ -0,0 +1,49 @@
+<?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="XPathActivityIcon"
+		class="net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathActivityIcon">
+		<property name="colourManager" ref="colourManager" />
+	</bean>
+
+	<bean id="XPathTemplateService"
+		class="net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathTemplateService" />
+
+	<bean id="ConfigureXPathActivityMenuAction"
+		class="net.sf.taverna.t2.activities.xpath.ui.contextualview.ConfigureXPathActivityMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="fileManager" ref="fileManager" />
+		<property name="activityIconManager" ref="activityIconManager" />
+		<property name="serviceDescriptionRegistry" ref="serviceDescriptionRegistry" />
+		<property name="serviceRegistry" ref="serviceRegistry" />
+	</bean>
+	<bean id="AddXPathTemplateAction"
+		class="net.sf.taverna.t2.activities.xpath.ui.menu.AddXPathTemplateAction">
+		<property name="editManager" ref="editManager" />
+		<property name="menuManager" ref="menuManager" />
+		<property name="selectionManager" ref="selectionManager" />
+		<property name="activityIconManager" ref="activityIconManager" />
+		<property name="serviceRegistry" ref="serviceRegistry" />
+	</bean>
+	<bean id="AddXPathTemplateMenuAction"
+		class="net.sf.taverna.t2.activities.xpath.ui.menu.AddXPathTemplateMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="menuManager" ref="menuManager" />
+		<property name="selectionManager" ref="selectionManager" />
+		<property name="activityIconManager" ref="activityIconManager" />
+		<property name="serviceRegistry" ref="serviceRegistry" />
+	</bean>
+
+	<bean id="XPathActivityMainContextViewFactory"
+		class="net.sf.taverna.t2.activities.xpath.ui.contextualview.XPathActivityMainContextViewFactory">
+		<property name="editManager" ref="editManager" />
+		<property name="fileManager" ref="fileManager" />
+		<property name="activityIconManager" ref="activityIconManager" />
+		<property name="serviceDescriptionRegistry" ref="serviceDescriptionRegistry" />
+		<property name="serviceRegistry" ref="serviceRegistry" />
+	</bean>
+
+</beans>
