diff --git a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java
new file mode 100644
index 0000000..da1ece3
--- /dev/null
+++ b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java
@@ -0,0 +1,81 @@
+package org.apache.taverna.scufl2.cwl;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.apache.taverna.scufl2.api.common.NamedSet;
+import org.apache.taverna.scufl2.api.core.DataLink;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.port.InputProcessorPort;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.SenderPort;
+import org.apache.taverna.scufl2.cwl.components.InputPort;
+import org.apache.taverna.scufl2.cwl.components.OutputPort;
+import org.apache.taverna.scufl2.cwl.components.Reference;
+import org.apache.taverna.scufl2.cwl.components.Step;
+import org.apache.taverna.scufl2.cwl.components.WorkflowProcess;
+
+public class TavernaConverter {
+
+    public WorkflowProcess convertWorkflow(Workflow workflow) {
+        WorkflowProcess process = new WorkflowProcess();
+        process.setName(workflow.getName());
+        Set<InputPort> inputs = convertInputPorts(workflow);
+        Set<OutputPort> outputs = convertOutputPorts(workflow);
+
+        process.setInputPorts(inputs);
+        process.setOutputPorts(outputs);
+
+        return process;
+    }
+
+    public Set<InputPort> convertInputPorts(Workflow workflow) {
+        Set<InputPort> result = new HashSet<>();
+        for(InputWorkflowPort workflowPort: workflow.getInputPorts()) {
+            InputPort port = new InputPort(workflowPort.getName(), "");
+            result.add(port);
+        }
+        return result;
+    }
+
+    public Set<OutputPort> convertOutputPorts(Workflow workflow) {
+        Set<OutputPort> result = new HashSet<>();
+        for(OutputWorkflowPort workflowPort: workflow.getOutputPorts()) {
+            OutputPort port = new OutputPort(workflowPort.getName());
+            result.add(port);
+        }
+        return result;
+    }
+
+    public Set<Step> convertProcessors(Workflow workflow) {
+        Set<Step> result = new HashSet<>();
+        NamedSet<Processor> processors = workflow.getProcessors();
+        Set<DataLink> dataLinks = workflow.getDataLinks();
+        Map<String, SenderPort> portNameToSource = new HashMap<>();
+        for(DataLink link: dataLinks) {
+            portNameToSource.put(link.getSendsTo().getName(), link.getReceivesFrom());
+        }
+
+        for(Processor processor: processors) {
+            Step step = convertProcessor(processor, portNameToSource);
+            result.add(step);
+        }
+        return result;
+    }
+
+    public Step convertProcessor(Processor processor, Map<String, SenderPort> portNameToSource) {
+        Step step = new Step();
+        step.setRun(new Reference(processor.getName())); // TODO: Support nested steps. Check name value.
+        for(InputProcessorPort port: processor.getInputPorts()) {
+            InputPort stepPort = new InputPort();
+            stepPort.setName(port.getName());
+            SenderPort senderPort = portNameToSource.get(port.getName());
+            stepPort.setSource(senderPort.getName());
+            step.getInputs().add(stepPort);
+        }
+        return step;
+    }
+}
diff --git a/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java
new file mode 100644
index 0000000..14bb8a0
--- /dev/null
+++ b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.scufl2.cwl;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+import org.apache.taverna.scufl2.cwl.components.InputPort;
+import org.apache.taverna.scufl2.cwl.components.Reference;
+import org.apache.taverna.scufl2.cwl.components.Step;
+import org.apache.taverna.scufl2.cwl.components.WorkflowProcess;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+
+public class TestTavernaConverter {
+
+    @Test
+    public void testWorkflowToWorkflowProcess() {
+        Workflow workflow = new Workflow();
+        workflow.setName("workflowName");
+        workflow.getInputPorts().add(new InputWorkflowPort(workflow, "input1"));
+        workflow.getInputPorts().add(new InputWorkflowPort(workflow, "input2"));
+        workflow.getOutputPorts().add(new OutputWorkflowPort(workflow, "output"));
+
+        TavernaConverter converter = new TavernaConverter();
+
+        WorkflowProcess workflowProcess = converter.convertWorkflow(workflow);
+        assertEquals(workflow.getInputPorts().size(), workflowProcess.getInputPorts().size());
+        assertEquals(workflow.getOutputPorts().size(), workflowProcess.getOutputPorts().size());
+
+        Set<String> expectedInputNames = workflow.getInputPorts().stream().map(InputWorkflowPort::getName).collect(Collectors.toSet());
+        Set<String> convertedInputNames = workflowProcess.getInputPorts().stream().map(InputPort::getName).collect(Collectors.toSet());
+
+        assertEquals(expectedInputNames, convertedInputNames);
+
+        assertEquals("output", workflowProcess.getOutputPorts().iterator().next().getName());
+    }
+
+    @Test
+    public void testProcessorsToSteps() {
+        Workflow workflow = new Workflow();
+        workflow.setName("workflowName");
+        workflow.getProcessors().add(new Processor(workflow, "processor1"));
+        workflow.getProcessors().add(new Processor(workflow, "processor2"));
+
+        Step step1 = new Step();
+        step1.setRun(new Reference("processor1"));
+        Step step2 = new Step();
+        step2.setRun(new Reference("processor2"));
+        Set<Step> steps = new HashSet<>();
+        steps.add(step1);
+        steps.add(step2);
+
+        TavernaConverter converter = new TavernaConverter();
+        Set<Step> convertedSteps = converter.convertProcessors(workflow);
+
+        assertEquals(steps, convertedSteps);
+    }
+}
