diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 00f9bb80b6bd773cc6aad4b5d4ce99ad77e1c8a9..09d6ebc7e831c7368b9f8869052a226f5b43b84a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -132,6 +132,13 @@ losoto_clip:
   allow_failure: true
   script:
     - cwl-runner --no-container steps/LoSoTo.Clip.cwl test_jobs/losoto_clip.json
+
+losoto_clocktec:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.ClockTec.cwl test_jobs/losoto_clocktec.json
+
 losoto_flagextend:
   stage: test_steps
   allow_failure: true
diff --git a/steps/DP3.AOFlaggerStepGenerator.cwl b/steps/DP3.AOFlaggerStepGenerator.cwl
index 2a70f602771d7e5e669ba46ee395550807bb379d..cc2701971c822351d3f40a916eb6978749852fe4 100755
--- a/steps/DP3.AOFlaggerStepGenerator.cwl
+++ b/steps/DP3.AOFlaggerStepGenerator.cwl
@@ -42,7 +42,7 @@ inputs:
       available memory too much affects flagging accuracy; in general try to use
       at least 10 GB of memory.
   - id: memorymax
-    type: double
+    type: float
     default: 0
     doc: >-
       Maximum amount of memory (in GB) to use. ⇐0 means no maximum. As stated
@@ -56,7 +56,7 @@ inputs:
       memory to use. Note that the time window can be extended with an overlap
       on the left and right side to minimize possible boundary effects.
   - id: overlapperc
-    type: double
+    type: float
     default: 0
     doc: >-
       If >0, percentage of time window to be added to the left and right side
diff --git a/steps/DP3.ApplyBeamStepGenerator.cwl b/steps/DP3.ApplyBeamStepGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..3e0c9fde9da2eb2b577339fc8bfde8c36e00c6c8
--- /dev/null
+++ b/steps/DP3.ApplyBeamStepGenerator.cwl
@@ -0,0 +1,104 @@
+#!/usr/bin/env cwl-runner
+
+class: Workflow
+cwlVersion: v1.0
+id: applybeam_step_generator
+
+inputs:
+  - id: steps
+    type: Any[]?
+    default: []
+  - id: step_name
+    type: string
+    doc: unique name for the step
+    default: applybeam
+
+  - id: direction
+    type: string?
+    doc: A RA/Dec value specifying in what direction to correct the beam. See phaseshift.phasecenter for syntax. If empty, the beam is corrected in the direction of the current phase center. 
+  - id: onebeamperpatch
+    type: string?
+    doc: |
+      Compute the beam only for the center of each patch
+      (saves computation time, but you should set this to false for large
+      patches). 
+      In the ApplyBeam step, this setting does not make sense 
+      (but it does if the applybeam is part of predict, ddecal, gaincal,
+      h5parmpredict, etc.). 
+      Generally, FALSE is the right setting for this option. 
+      The default has changed to false in a recent (Nov 2018) version. 
+  - id: usechannelfreq
+    type: boolean?
+    doc: |
+      Compute the beam for each channel of the measurement set separately.
+      This is useful for merged / concatenated measurement sets.
+      For raw LOFAR data you should set it to false,
+      so that the beam will be formed as in the station hardware.
+      Also, setting it to false is faster.
+      
+  - id: updateweights
+    type: boolean?
+    doc: |
+      Update the weights column, in a way consistent with
+      the weights being inverse proportional to the autocorrelations
+      (e.g. if 'autoweights' was used before).
+
+  - id: invert
+    type: boolean?
+    doc: |
+      Invert the corrections, to correct the data. Default is true.
+      If you want to corrupt the data, set it to 'false'
+     
+  - id: beammode
+    
+    type:
+      type: enum
+      symbols:
+       - array_factor
+       - element
+       - default
+    doc: |
+      Beam mode to apply, can be “array_factor”, “element” or “default”.
+      Default is to apply both the element beam and the array factor. 
+    
+    
+outputs:
+  - id: augmented_steps
+    outputSource:
+      - DP3_GenericStep/augmented_steps
+    type: Any[]
+steps:
+  - id: DP3_GenericStep
+    in:
+      - id: step_type
+        default: 'applybeam'
+      - id: step_id
+        source: step_name
+      - id: steps
+        source: steps
+      - id: parameters
+        valueFrom: $(inputs)
+
+      - id: direction
+        source: direction
+      - id: onebeamperpatch
+        source: onebeamperpatch
+      - id: usechannelfreq
+        source: usechannelfreq
+      - id: updateweights
+        source: updateweights
+      - id: invert
+        source: invert
+      - id: beammode
+        source: beammode
+
+
+#-------------------------------
+
+    out:
+      - augmented_steps
+    run: ../steps/DP3.GenericStep.cwl
+requirements:
+  - class: StepInputExpressionRequirement
+  - class: InlineJavascriptRequirement
+  - class: MultipleInputFeatureRequirement
diff --git a/steps/DP3.Execute.cwl b/steps/DP3.Execute.cwl
index e1f3bbfd445ec81cfb820afd4fc8a52800d402be..c46e50662b5ee48c157f8f1e2af0e8b7b3ee3719 100644
--- a/steps/DP3.Execute.cwl
+++ b/steps/DP3.Execute.cwl
@@ -7,8 +7,8 @@ $namespaces:
 inputs:
   - id: msout_name
     type: string
-    'sbg:x': -425.39886474609375
-    'sbg:y': 127
+    'sbg:x': -418
+    'sbg:y': 187
   - id: msin
     type: Directory
     'sbg:x': -254.39886474609375
@@ -20,8 +20,16 @@ inputs:
   - id: autoweight
     type: boolean
     default: true
-    'sbg:x': -113
-    'sbg:y': 290
+    'sbg:x': -42
+    'sbg:y': 305
+  - id: output_column
+    type: string?
+    'sbg:x': -513
+    'sbg:y': 104
+  - id: input_column
+    type: string?
+    'sbg:x': -248.0078125
+    'sbg:y': 363
 outputs:
   - id: secondary_output_files
     outputSource:
@@ -76,6 +84,10 @@ steps:
         source: generic_step/output_directory_names
       - id: autoweight
         source: autoweight
+      - id: output_column
+        source: output_column
+      - id: input_column
+        source: input_column
     out:
       - id: msout
       - id: secondary_output_files
diff --git a/steps/DPPP.cwl b/steps/DPPP.cwl
index 17005aba9681c9e66fb293bd574331935a4cedca..b7f2dd56a92913e3adbbcea5370d4a3b978d2a98 100755
--- a/steps/DPPP.cwl
+++ b/steps/DPPP.cwl
@@ -37,11 +37,40 @@ inputs:
   - id: output_directory_names
     type: Any
     doc: Expected output file names
-  - id: autoweight
+  - default: true
+    id: autoweight
     type: boolean
-    default: true
     inputBinding:
-      prefix: -msin.autoweight=True
+      position: 0
+      prefix: '-msin.autoweight=True'
+  - default: "dysco"
+    id: storagemanager
+    type: string
+    inputBinding:
+      position: 0
+      prefix: '-msout.storagemanager='
+      separate: false
+  - default: ''
+    id: baseline
+    type: string
+    inputBinding:
+      position: 0
+      prefix: '-msin.baseline='
+      separate: false
+  - default: DATA
+    id: output_column
+    type: string?
+    inputBinding:
+      position: 0
+      prefix: '-msout.datacolumn='
+      separate: false
+  - default: DATA
+    id: input_column
+    type: string?
+    inputBinding:
+      position: 0
+      prefix: '-msin.datacolumn='
+      separate: false
 outputs:
   - id: msout
     doc: Output Measurement Set
diff --git a/steps/LoSoTo.ClockTec.cwl b/steps/LoSoTo.ClockTec.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..a328b6bef5d6e5fe25a636b50417220397c5f460
--- /dev/null
+++ b/steps/LoSoTo.ClockTec.cwl
@@ -0,0 +1,95 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_clocktec
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+doc: |
+  Separate phase solutions into Clock and TEC.
+  The Clock and TEC values are stored in the specified output soltab with type 'clock', 'tec', 'tec3rd'.
+
+requirements:
+  InlineJavascriptRequirement:
+    expressionLib:
+      - { $include: utils.js}
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: $(get_losoto_config('CLOCKTEC').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/lofar-pipeline-ci:latest
+
+inputs:
+  - id: input_h5parm
+    type: File
+    format: lofar:#H5Parm
+  - id: soltab
+    type: string
+    doc: "Solution table"
+  - id: clocksoltabOut
+    doc: output soltab name for clock
+    type: string?
+  - id: tecsoltabOut
+    doc: output soltab name for tec
+    type: string?
+  - id: offsetsoltabOut
+    doc: output soltab name for phase offset
+    type: string?
+  - id: tec3rdsoltabOut
+    doc: output soltab name for tec3rd offset
+    type: string?
+  - id: flagBadChannels
+    type: boolean?
+    doc: Detect and remove bad channel before fitting, by default True.
+  - id: flagCut
+    type: float?
+  - id: chi2cut
+    type: float?
+  - id: combinePol
+    type: boolean?
+    doc: |
+      Find a combined polarization solution, by default False.
+  - id: removePhaseWraps
+    type: boolean?
+    doc: |
+      Detect and remove phase wraps, by default True.
+  - id: fit3rdorder
+    type: boolean?
+    doc: |
+      Fit a 3rd order ionospheric ocmponent (usefult <40 MHz). By default False.
+  - id: circular
+    type: boolean?
+    doc: |
+      Assume circular polarization with FR not removed. By default False.
+  - id: reverse
+    type: boolean?
+    doc:
+      Reverse the time axis. By default False.
+  - id: invertOffset
+    type: boolean?
+    doc: |
+      Invert (reverse the sign of) the phase offsets. By default False. Set to True
+      if you want to use them with the residuals operation.
+
+outputs:
+  - id: output_h5parm
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/applycal.cwl b/steps/applycal.cwl
index 08b76e9418d1397f798917abcac4f31a6397050b..5a62a2119adb8792c0d86d1708cf717757672cf9 100644
--- a/steps/applycal.cwl
+++ b/steps/applycal.cwl
@@ -5,8 +5,6 @@ $namespaces:
 id: applycal
 baseCommand:
   - DPPP
-arguments:
-  - steps=[applycal]
 inputs:
   - id: msin
     type: Directory
@@ -25,41 +23,56 @@ inputs:
     doc: Input data Column
   - id: parmdb
     type: File
-    doc: Path of parmdb in which the parameters are stored. This can also be an H5Parm file, in that case the filename has to end in '.h5'
     inputBinding:
-      prefix: applycal.parmdb
-  - id: correction
-    default: gain
-    type:
-      type: enum
-      symbols:
-        - gain
-        - tec
-        - clock
-        - rotationangle
-        - rotation
-        - scalarphase
-        - scalaramplitude
-        - rotationmeasure
-        - fulljones
-    doc: | 
-        Type of correction to perform. When using H5Parm, this is for now the name of the soltab; the type will be deduced from the metadata in that soltab, except for full Jones, in which case correction should be 'fulljones'.
+      position: 0
+      prefix: applycal.parmdb=
+      separate: false
+    doc: >-
+      Path of parmdb in which the parameters are stored. This can also be an
+      H5Parm file, in that case the filename has to end in '.h5'
+  - id: msout_datacolumn
+    type: string
+    inputBinding:
+      position: 0
+      prefix: msout.datacolumn=
+      separate: false
+    doc: Output data column
+  - default: gain
+    id: correction
+    type: string
+    inputBinding:
+      position: 0
+      prefix: applycal.correction=
+      separate: false
+    doc: >
+      Type of correction to perform. When using H5Parm, this is for now the name
+      of the soltab; the type will be deduced from the metadata in that soltab,
+      except for full Jones, in which case correction should be 'fulljones'.
+  - id: storagemanager
+    type: string
+    default: dysco
+    inputBinding
+      prefix: msout.storagemanager=
+  - id: updateweights
+    type: boolean?
     inputBinding:
-        prefix: applycal.correction=
-  
+      position: 0
+      prefix: -applycal.updateweights=True
 outputs:
   - id: msout
     doc: Output Measurement Set
     type: Directory
     outputBinding:
-        glob: $(inputs.msin.basename)
-      
+      glob: $(inputs.msin.basename)
+arguments:
+  - 'steps=[applycal]'
+  - msout=.
 requirements:
   - class: InitialWorkDirRequirement
     listing:
-        - entry: $(inputs.msin)
-          writable: true
+      - entry: $(inputs.msin)
+        writable: true
   - class: InlineJavascriptRequirement
 hints:
   - class: DockerRequirement
-    dockerPull: lofareosc/lofar-pipeline-ci:latest
+    dockerPull: 'lofareosc/lofar-pipeline-ci:latest'
diff --git a/steps/ddecal.cwl b/steps/ddecal.cwl
index 7268170ca6f13e8e9a95ad741f2d868827a3ea27..3eddf9ef67016053829920325c18bd45ceb4f470 100644
--- a/steps/ddecal.cwl
+++ b/steps/ddecal.cwl
@@ -2,7 +2,7 @@
 
 class: CommandLineTool
 cwlVersion: v1.0
-id: ddecal
+id: calib_rot_diag
 baseCommand: [DPPP]
 
 requirements:
@@ -14,7 +14,6 @@ hints:
 
 arguments:
   - steps=[ddecal]
-  - ddecal.mode=rotation+diagonal
   - ddecal.uvlambdamin=300
   - ddecal.maxiter=50
   - ddecal.nchan=1
@@ -30,38 +29,38 @@ inputs:
     type: Directory?
     doc: Input Measurement Set
     inputBinding:
-        prefix: msin=
-        separate: false
+      prefix: msin=
+      separate: false
 
   - id: msin_datacolumn
     type: string
     default: DATA
     doc: Input data Column
     inputBinding:
-        prefix: msin.datacolumn=
-        separate: false
+      prefix: msin.datacolumn=
+      separate: false
 
   - id: msin_modelcolum
     type: string
     default: MODEL_DATA
     doc: Model data Column
     inputBinding:
-        prefix: msin.modelcolumn=
-        separate: false
+      prefix: msin.modelcolumn=
+      separate: false
 
   - id: output_name_h5parm
     type: string
     default: instrument.h5
     inputBinding:
-        prefix: ddecal.h5parm=
-        separate: false
+      prefix: ddecal.h5parm=
+      separate: false
   - id: msout_name
     type: string
     doc: Output Measurement Set
     default: out.MS
     inputBinding:
-        prefix: msout=
-        separate: false
+      prefix: msout=
+      separate: false
 
 #--------------------
   - id: propagate_solutions
@@ -91,6 +90,31 @@ inputs:
       and mode=rotation+diagonal.
     inputBinding:
       prefix: flagdivergedonly=True
+  - id: storagemanager
+    type: string
+    default: dysco
+    inputBinding
+      prefix: msout.storagemanager=
+  - id: mode
+    type:
+      type: enum
+      symbols:
+        - scalarcomplexgain
+        - scalarphase
+        - scalaramplitude
+        - tec
+        - tecandphase
+        - fulljones
+        - diagonal
+        - phaseonly
+        - amplitudeonly
+        - rotation
+        - rotation+diagonal
+    doc: |
+      Type of constraint to apply. Options are
+    inputBinding:
+      prefix: ddecal.mode=
+      separate: false
 outputs:
   - id: msout
     doc: Output Measurement Set
diff --git a/steps/gaincal.cwl b/steps/gaincal.cwl
index e017373e0bfe4a6ef68930d4f380dbfbc8cb65e7..d57b71284e6dbbb7c8068f505c3d0b00b97d1868 100644
--- a/steps/gaincal.cwl
+++ b/steps/gaincal.cwl
@@ -51,6 +51,11 @@ inputs:
     inputBinding:
         prefix: gaincal.usebeammodel=true
         separate: false
+  - id: storagemanager
+    type: string
+    default: dysco
+    inputBinding
+      prefix: msout.storagemanager=
   - id: solint
     type: int
     default: 1
diff --git a/steps/predict.cwl b/steps/predict.cwl
index d9facbb83d6430dcde76caf49490e711afe14952..d785f10865aa797e555d7690459619a753ba4783 100644
--- a/steps/predict.cwl
+++ b/steps/predict.cwl
@@ -21,6 +21,11 @@ inputs:
       prefix: msin.datacolumn=
       separate: false
     doc: Input data Column
+  - id: storagemanager
+    type: string
+    default: dysco
+    inputBinding
+      prefix: msout.storagemanager=  
   - default: MODEL_DATA
     id: msout_datacolumn
     type: string
diff --git a/test_jobs/ddecal.json b/test_jobs/ddecal.json
index 13a89c1f35db2da2d1be6966d5f213619360e514..66f549e1dea0814a6e94949caa8b12615853fe16 100644
--- a/test_jobs/ddecal.json
+++ b/test_jobs/ddecal.json
@@ -4,5 +4,6 @@
     "path": "/data/L570745_SB001_uv_MODEL.MS"
   },
   "msin_datacolumn": "DATA", 
-  "usemodelcolumn": true
+  "usemodelcolumn": true,
+  "mode": "diagonal"
 }
diff --git a/test_jobs/losoto_clocktec.json b/test_jobs/losoto_clocktec.json
new file mode 100644
index 0000000000000000000000000000000000000000..3632d7f13c8786836692e86a0a59a0cc1c9c96f0
--- /dev/null
+++ b/test_jobs/losoto_clocktec.json
@@ -0,0 +1,5 @@
+{
+  "input_h5parm": {"class": "File", "path": "/data/example.h5", "format": "lofar:#H5Parm"},
+  "soltab":  "sol000/phase000",
+  "ncpu": 1
+}