diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1c2ab1c69010466a5f8baef8f7c0457816582672..e209bc5b4959c395defb292a7d588655611291cf 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,6 +46,7 @@ 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
@@ -58,6 +59,18 @@ losoto_plotscreen:
   script:
     - cwl-runner --no-container steps/LoSoTo.Plotscreen.cwl test_jobs/losoto_plotscreen.json
 
+losoto_norm:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Norm.cwl test_jobs/losoto_norm.json
+
+losoto_residual:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Residual.cwl test_jobs/losoto_residual.json
+
 parset_selector:
   stage: test_steps
   allow_failure: true
diff --git a/steps/LoSoTo.Norm.cwl b/steps/LoSoTo.Norm.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..3a6c00db7afe768d06fd9d09a3b677cfe7e59935
--- /dev/null
+++ b/steps/LoSoTo.Norm.cwl
@@ -0,0 +1,53 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_abs
+
+doc: |
+  Normalize the solutions to a given value WEIGHT: Weights compliant
+
+requirements:
+  InlineJavascriptRequirement: {}
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: |
+          [norm]
+          soltab = $(inputs.soltab)
+          operation = NORM
+          axesToNorm = $(inputs.axesToNorm)
+          $(inputs.normVal !== null? 'normVal=' + inputs.normVal: '')
+
+      - 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: "Solution table"
+  - id: axesToNorm
+    type: string[]
+    doc: Axes along which compute the normalization
+  - id: normVal
+    type: float?
+    doc: Number to normalize to vals = vals * (normVal/valsMean), by default 1.
+
+outputs:
+  - id: output_h5parm
+    type: File
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
diff --git a/steps/LoSoTo.Residual.cwl b/steps/LoSoTo.Residual.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..e8aed596c8b965648201b33f045c6842dd9fac9c
--- /dev/null
+++ b/steps/LoSoTo.Residual.cwl
@@ -0,0 +1,52 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_abs
+
+doc: Subtract/divide two tables or a clock/tec/tec3rd/rm from a phase.
+
+requirements:
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: |
+          [residuals]
+          soltab = $(inputs.soltab)
+          operation=RESIDUALS
+          soltabsToSub=$(inputs.soltabsToSub)
+          ratio=$(inputs.ratio)
+
+      - 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: "Solution table"
+  - id: soltabsToSub
+    type: string[]
+    doc: List of soltabs to subtract
+  - id: ratio
+    type: boolean?
+    default: false
+    doc: Return the ratio instead of subtracting.
+
+outputs:
+  - id: output_h5parm
+    type: File
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
diff --git a/test_jobs/losoto_norm.json b/test_jobs/losoto_norm.json
new file mode 100644
index 0000000000000000000000000000000000000000..fad1ae92a9d3d2a5f40bbe5df6086194e15c1a40
--- /dev/null
+++ b/test_jobs/losoto_norm.json
@@ -0,0 +1,8 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5"
+        },
+    "soltab": "sol000/amplitude000",
+    "axesToNorm": ["time"]
+}
diff --git a/test_jobs/losoto_residual.json b/test_jobs/losoto_residual.json
new file mode 100644
index 0000000000000000000000000000000000000000..86b97d57348f716e4ffbc4399c02b4b1f038ba38
--- /dev/null
+++ b/test_jobs/losoto_residual.json
@@ -0,0 +1,8 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5"
+        },
+    "soltab": "sol000/amplitude000",
+    "soltabsToSub": ["amplitude000"]
+}