diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 466d724263fa72c3a328d544bb384be0f1499dd5..d0731b1da88d1e2f9c4ab3ff51648ed0a9bc7cbe 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,6 +46,11 @@ losoto_abs:
   allow_failure: true
   script:
     - cwl-runner --no-container steps/LoSoTo.Abs.cwl test_jobs/losoto_abs.json
+losoto_plot:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Plot.cwl test_jobs/losoto_plot.json
 
 parset_selector:
   stage: test_steps
diff --git a/steps/LoSoTo.Plot.cwl b/steps/LoSoTo.Plot.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..c87748e4445e413ba188c41cebe7f2528a13709b
--- /dev/null
+++ b/steps/LoSoTo.Plot.cwl
@@ -0,0 +1,141 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_plot
+
+doc: |
+  This operation for LoSoTo implements basic plotting WEIGHT:
+   flag-only compliant, no need for weight
+
+requirements:
+  InlineJavascriptRequirement:
+    expressionLib:
+     - |
+        function get_config() {
+        var par = ['soltab = ' + inputs.soltab]
+        if (inputs.ncpu !== null) par.push('ncpu='+inputs.ncpu);
+        par.push('[plot]')
+        par.push('operation = PLOT')
+        for(var field_name in inputs){
+            if(field_name === 'input_h5parm' ||
+               field_name === 'soltab' ||
+               field_name === 'ncpu') continue;
+            if(inputs[field_name] === null ||
+               inputs[field_name] === 'null') continue;
+            par.push(field_name+'='+inputs[field_name])
+        }
+        return par
+        }
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: $(get_config().join('\n'))
+      - entryname: $(inputs.input_h5parm.basename)
+        entry: $(inputs.input_h5parm)
+        writable: true
+
+
+baseCommand: "losoto"
+
+arguments:
+  - $(inputs.input_h5parm.basename)
+  - parset.config
+
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
+
+inputs:
+  - id: input_h5parm
+    type: File
+  - id: soltab
+    type: string[]
+    doc: "Tabs to plot"
+
+  - id: axesInPlot
+    type: string[]?
+    default: []
+    doc: |
+      1- or 2-element array which says the coordinates to plot (2 for 3D plots).
+  - id: axisInTable
+    type: string?
+    doc: |
+      the axis to plot on a page - e.g. ant to get all antenna’s on one file.
+  - id: axisInCol
+    type: string?
+    doc: |
+      The axis to plot in different colours - e.g. pol to get correlations with
+       different colors.
+  - id: axisDiff
+    type: string?
+    doc: |
+      This must be a len=2 axis and the plot will have the differential value
+      - e.g. ‘pol’ to plot XX-YY.
+  - id: NColFig
+    type: int?
+    doc: |
+      Number of columns in a multi-table image. By default is automatically
+      chosen.
+  - id: figSize
+    type: int[]
+    default: [0,0]
+    doc: |
+      Size of the image [x,y], if one of the values is 0, then it is
+      automatically chosen. By default automatic set.
+  - id: markerSize
+    type: int?
+    default: 2
+    doc: |
+      Size of the markers in the 2D plot. By default 2.
+  - id: minmax
+    type: float[]?
+    doc: |
+      Min max value for the independent variable (0 means automatic).
+  - id: log
+    type: string?
+    doc: |
+      Use Log=’XYZ’ to set which axes to put in Log.
+  - id: plotFlag
+    type: boolean?
+    default: false
+    doc: Whether to plot also flags as red points in 2D plots.
+  - id: doUnwrap
+    type: boolean?
+    default: false
+    doc: Unwrap phases.
+  - id: refAnt
+    type: string?
+    default: ''
+    doc: |
+      Reference antenna for phases. By default None.
+  - id: soltabsToAdd
+    type: string?
+    doc: |
+      Tables to “add” (e.g. ‘sol000/tec000’), it works only for tec and clock
+       to be added to phases.
+  - id: makeAntPlot
+    default: false
+    type: boolean?
+    doc: |
+       Make a plot containing antenna coordinates in x,y and in color the value
+        to plot, axesInPlot must be [ant].
+  - id: makeMovie
+    default: false
+    type: boolean?
+    doc: |
+      Make a movie summing up all the produced plots.
+  - id: prefix
+    type: string?
+    default: 'losoto.plot.'
+    doc: |
+      Prefix to add before the self-generated filename.
+  - id: ncpu
+    type: int?
+    doc: Number of cpus, by default all available.
+
+outputs:
+  - id: output_plots
+    type: File[]
+    outputBinding:
+      glob: "$(inputs.prefix)*.png"
diff --git a/test_jobs/losoto_plot.json b/test_jobs/losoto_plot.json
new file mode 100644
index 0000000000000000000000000000000000000000..f4ed8634385489ed89ebc99ceed0c1509d127172
--- /dev/null
+++ b/test_jobs/losoto_plot.json
@@ -0,0 +1,6 @@
+{
+  "input_h5parm": {"class": "File", "path": "/data/example.h5"},
+  "soltab":  ["sol000/phase000"],
+  "axesInPlot": ["time"],
+  "ncpu": 1
+}