diff --git a/steps/predict.cwl b/steps/predict.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..e20f0151dcccf1f1bf0c33f52488cd78c3ccdba1
--- /dev/null
+++ b/steps/predict.cwl
@@ -0,0 +1,66 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: ddecal
+baseCommand: [DPPP]
+
+requirements:
+  InlineJavascriptRequirement: {}
+
+hints:
+  DockerRequirement:
+    dockerPull: prefactor
+
+arguments:
+  - steps=[predict]
+  - predict.beammode=array_factor
+  - predict.usechannelfreq=False
+inputs:
+  - id: msin
+    type: Directory?
+    doc: Input Measurement Set
+    inputBinding:
+        prefix: msin=
+        separate: false
+  - id: msin_datacolumn
+    type: string
+    default: SMOOTHED_DATA
+    doc: Input data Column
+    inputBinding:
+        prefix: msin.datacolumn=
+        separate: false
+  - id: msout_datacolumn
+    type: string
+    default: MODEL_DATA
+  - id: source_db
+    type: "[File, Directory]"
+    inputBinding:
+      prefix: predict.sourcedb=
+      separate: false
+  - id: skymodel
+    type: string[]
+    inputBinding:
+      prefix: predict.sources=
+      valueFrom: [$(self)]
+      separate: false
+      itemSeparator: ','
+  - id: usebeammodel
+    type: boolean
+    default: false
+    inputBinding:
+      prefix: predict.usebeammodel=True
+  - id: msout_name
+    type: string
+    doc: Output Measurement Set
+    default: out.MS
+    inputBinding:
+        prefix: msout=
+        separate: false
+
+outputs:
+  - id: msout
+    doc: Output Measurement Set
+    type: Directory
+    outputBinding:
+      glob: $(inputs.msout_name=="."?inputs.msin:inputs.msout_name)