diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..6ada2877b3453550a6cec11b68ffad30847f84bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,131 @@
+test_data/*.MS
+Docker/scripts
+*.sif
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# Not idea
+.idea
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8deb132b9ddce5168b0dfea3178158cad26bc6a0
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,174 @@
+image: lofareosc/lofar-pipeline-ci:latest
+
+variables:
+  TEST_DATASET_NAME: "L570745_uv_first10.MS.tar.xz"
+  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+
+stages:
+  - build_docker
+  - push_docker
+  - validate_cwl_scripts
+  - test_steps
+  - integration_test
+
+before_script:
+   - mkdir workdir
+   - mkdir logs
+
+after_script:
+  - echo "All done"
+
+build_docker:
+  image: docker:latest
+  stage: build_docker
+  only:
+    - tags
+  script:
+    - apk add git subversion git-lfs bash
+    - cd Docker
+    - bash build_docker.sh
+
+push_docker_tags:
+  image: docker:latest
+  allow_failure: true
+  stage: push_docker
+  only:
+    - tags
+  script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - docker tag lofareosc/prefactor-ci:latest $CI_REGISTRY/prefactor-ci:$CI_COMMIT_REF_NAME
+    - docker push $CI_REGISTRY/prefactor-ci:$CI_COMMIT_REF_NAME
+
+validate_scripts:
+  stage: validate_cwl_scripts
+  script:
+    - for file in `find . -name 'steps/*.cwl'`; do cwltool --validate $file; done
+
+average_step_generator:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner steps/DP3.AveragerStepGenerator.cwl test_jobs/averager_step_generator.json
+    - ! cwl-runner steps/DP3.AveragerStepGenerator.cwl test_jobs/averager_step_generator_error.json
+
+aoflagger_step_generator:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner steps/DP3.AOFlaggerStepGenerator.cwl test_jobs/aoflagger_step_generator.json
+
+preflagger_step_generator:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner steps/DP3.PreflaggerStepGenerator.cwl test_jobs/preflagger_step_generator.json
+
+losoto_abs:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Abs.cwl test_jobs/losoto_abs.json
+
+losoto_duplicate:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Duplicate.cwl test_jobs/losoto_duplicate.json
+
+losoto_plot:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Plot.cwl test_jobs/losoto_plot.json
+
+losoto_norm:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Norm.cwl test_jobs/losoto_norm.json
+
+losoto_replicateonaxis:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Replicateonaxis.cwl test_jobs/losoto_replicateonaxis.json
+
+losoto_reset:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner --no-container steps/LoSoTo.Reset.cwl test_jobs/losoto_reset.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
+  script:
+    - cwl-runner steps/DP3.Selector.cwl test_jobs/selector.json
+
+file_selector:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwl-runner steps/FileSelector.cwl test_jobs/file_selector.json
+
+NDPPP:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH steps/DPPP.cwl test_jobs/NDPPP.json
+
+DP3.Execute:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH steps/DP3.Execute.cwl test_jobs/dp3_execute.json
+
+h5parm_collector:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/H5ParmCollector.cwl test_jobs/h5parm_collector.json
+
+aoflagger:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH steps/AOFlagger.cwl test_jobs/aoflagger.json
+
+interpolate_visibilities:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/interpolate_visibilities.cwl test_jobs/interpolate_visibilities.json
+
+h5parm_collector:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/H5ParmCollector.cwl test_jobs/h5parm_collector.json
+
+blsmooth:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/blsmooth.cwl test_jobs/blsmooth.json
+
+ddecal:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/ddecal.cwl test_jobs/ddecal.json
+
+predict:
+  stage: test_steps
+  allow_failure: true
+  script:
+    - cwltool --no-container --preserve-environment LD_LIBRARY_PATH --preserve-environment PATH --preserve-environment PYTHONPATH steps/predict.cwl test_jobs/predict.json
+
+
diff --git a/Docker/.entrypoint b/Docker/.entrypoint
new file mode 100644
index 0000000000000000000000000000000000000000..cc2b666b7d5c93c2a7e7ea6715c17acd498f338d
--- /dev/null
+++ b/Docker/.entrypoint
@@ -0,0 +1,5 @@
+#!/bin/bash
+set -e
+
+exec "$@"
+
diff --git a/Docker/Dockerfile b/Docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..9ed60bf990c4867abc89abf5aadae69978d4365a
--- /dev/null
+++ b/Docker/Dockerfile
@@ -0,0 +1,152 @@
+FROM kernsuite/base:5 as builder
+SHELL ["/bin/bash", "-c"]
+
+RUN export DEBIAN_FRONTEND=noninteractive && \ 
+    apt-get update && \
+    apt-get install -y \
+        casacore-data \
+        casacore-dev \
+        libboost-python-dev \
+        libcfitsio-dev \
+        python-dev \
+        python3-numpy \
+        cmake \
+        build-essential \
+        libhdf5-serial-dev \
+        libarmadillo-dev \
+        libboost-filesystem-dev \
+        libboost-system-dev \
+        libboost-date-time-dev \
+        libboost-signals-dev \ 
+        libboost-program-options-dev \
+        libboost-test-dev \
+        libxml2-dev \
+        libpng-dev \
+        pkg-config \
+        aoflagger-dev \
+        libgtkmm-3.0-dev \
+        git \
+        wget \
+        libfftw3-dev \
+        libgsl-dev
+        
+RUN mkdir -p /src/
+WORKDIR /src/
+
+
+# Build the IDG version from source
+
+
+ADD ./idg /src/idg/src
+RUN mkdir idg/build && cd idg/build && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/ ../src && make install -j2
+
+ADD ./DP3 /src/dp3/src
+RUN cd /src/dp3/  && \
+    mkdir build && \
+    cd build && \
+    cmake ../src -DCMAKE_INSTALL_PREFIX=/usr/local/ -DPORTABLE=True &&\
+    make -j2 && \
+    make install -j2
+
+ADD ./STMAN /src/STMAN/src
+RUN cd /src/STMAN/ && \
+    mkdir build && \
+    cd build && \
+    cmake ../src -DCMAKE_INSTALL_PREFIX=/usr/local/ -DPORTABLE=True && \
+    make -j2 && \
+    make install -j2
+    
+ADD ./Dysco /src/Dysco/src
+RUN cd /src/Dysco/ && \
+    mkdir build && \
+    cd build && \
+    cmake ../src -DCMAKE_INSTALL_PREFIX=/usr/local/ -DPORTABLE=True && \
+    make -j2 && \
+    make install -j2
+
+#----------------------------------------------
+FROM kernsuite/base:5 as runner
+
+COPY --from=builder /usr/local/ /usr/local
+
+SHELL ["/bin/bash", "-c"]
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+    apt-get update && \
+    apt-get install -y \
+        aoflagger \
+        casacore-data \
+        libarmadillo8 \
+        libboost-date-time1.65.1 \
+        libboost-filesystem1.65.1 \
+        libboost-python1.65.1 \
+        libboost-program-options1.65.1 \
+        libboost-system1.65.1 \
+        libboost-signals1.65.1 \
+        libboost-test1.65.1 \
+        libboost-python1.65-dev \
+        libstationresponse2 \
+        libcasa-* \
+        libcfitsio5 \
+        libgtkmm-3.0 \
+        libfftw3-3 \
+        libhdf5-cpp-100 \
+        libpng16-16 \
+        libxml2 \
+        python3.7 \
+        python3-casacore \
+        python3-numpy \
+        python3-scipy && \
+    rm -rf /var/lib/apt/lists/*
+
+
+RUN mkdir /home/lofaruser/ && \ 
+    groupadd -r lofaruser && \
+    useradd --no-log-init -r -g lofaruser lofaruser && \
+    chown lofaruser:lofaruser /home/lofaruser
+
+ARG TOIL_VERSION=3.20.0
+LABEL toil.version=${TOIL_VERSION}
+
+ARG LSMTool_TAG=master
+LABEL LSMTool.version.tag=${LSMTool_TAG}
+
+ARG LoSoTo_TAG=master
+LABEL LoSoTo.version.tag=${LoSoTo_TAG}
+
+ARG STMAN_TAG=master
+LABEL STMAN.version.tag=${STMAN_TAG}
+
+ARG Dysco_TAG=master
+LABEL Dysco.version.tag=${Dysco_TAG}
+
+    
+RUN apt update && apt install -y nodejs python3-pip git wsclean
+RUN python3 -m pip install cwltool cwl-runner -e "git://github.com/darafferty/LSMTool.git@${LSMTool_TAG}#egg=LSMTool" \
+                                   "toil[cwl]"==${TOIL_VERSION} \
+                                   matplotlib
+
+RUN python3 -m pip install -e "git+https://github.com/revoltek/losoto.git@${LoSoTo_TAG}#egg=LoSoTo"
+
+ADD losoto.patch /home/lofaruser/losoto.patch
+RUN patch /src/losoto/losoto/operations/__init__.py /home/lofaruser/losoto.patch 
+ADD .entrypoint /home/lofaruser/.entrypoint
+RUN chown lofaruser:lofaruser /home/lofaruser/.entrypoint && \ 
+    chmod +rx /home/lofaruser/.entrypoint
+
+WORKDIR /home/lofaruser
+
+COPY prefactor/skymodels/* /data/skymodels/
+COPY prefactor/rfistrategies/* /data/rfistrategies/
+COPY prefactor/solutions/ /data/solutions/*
+
+
+RUN chmod +rx /usr/local/bin/*
+ENTRYPOINT ["/home/lofaruser/.entrypoint"]
+USER lofaruser
+
+ARG DP3_TAG=master
+ARG IDG_TAG=master
+
+LABEL IDG.version.tag=${IDG_TAG}
+LABEL DP3.version.tag=${DP3_TAG}
diff --git a/Docker/Dockerfile_ci b/Docker/Dockerfile_ci
new file mode 100644
index 0000000000000000000000000000000000000000..63baad2426e2610d5975d353f07d15476114eb0f
--- /dev/null
+++ b/Docker/Dockerfile_ci
@@ -0,0 +1,8 @@
+FROM lofareosc/lofar-pipeline:latest
+SHELL ["/bin/bash", "-c"]
+
+ADD L570745_uv_first10.MS.tar.xz /data
+ADD skymodels.tar.gz /data/skymodels
+ADD test_data/A-Team_lowres.sourcedb /data/A-Team_lowres.sourcedb
+ADD test_data/example.h5 /data/example.h5
+ADD test_data/L570745_SB001_uv_MODEL.MS /data/L570745_SB001_uv_MODEL.MS
diff --git a/Docker/L570745_uv_first10.MS.tar.xz.REMOVED.git-id b/Docker/L570745_uv_first10.MS.tar.xz.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..2266c40d2de8785cb1e771f88823e6fb2f02be07
--- /dev/null
+++ b/Docker/L570745_uv_first10.MS.tar.xz.REMOVED.git-id
@@ -0,0 +1 @@
+fac322047acad1a9cf1425d64a08d7bc3548f462
\ No newline at end of file
diff --git a/Docker/build_docker.sh b/Docker/build_docker.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b908b90fc708c4726fb1010c202c5945eafda4e2
--- /dev/null
+++ b/Docker/build_docker.sh
@@ -0,0 +1,52 @@
+#! /bin/bash
+set -e
+
+git_clone_or_pull () {
+    REPO=$1
+    BRANCH=$2
+    DIR=$3
+    if [ -d $DIR ] 
+    then
+     git -C "${DIR}" pull
+    else
+     git clone --depth 1 -b "${BRANCH}" "${REPO}" "${DIR}"
+    fi
+}
+
+# SOFTWARE VERSIONS
+DP3_TAG=v4.1
+IDG_TAG=0.6
+LSMTool_TAG=v1.4.2
+LoSoTo_TAG=f0398b
+TOIL_VERSION=3.20.0
+STMAN_TAG=master
+Dysco_TAG=v1.2
+Prefactor_TAG=master
+
+# FETCHES THE IDG
+git_clone_or_pull https://gitlab.com/astron-idg/idg/ ${IDG_TAG} idg
+
+# FETCHES DP3
+git_clone_or_pull https://github.com/lofar-astron/DP3 ${DP3_TAG} DP3
+
+# FETCHES STMAN
+git_clone_or_pull https://github.com/lofar-astron/LofarStMan ${STMAN_TAG} STMAN
+
+# FETCHES Dysco
+git_clone_or_pull https://github.com/aroffringa/dysco.git ${Dysco_TAG} Dysco
+
+
+SCRIPT_PATH=$(realpath ${BASH_SOURCE[0]})
+
+DOCKER_PATH=$(dirname ${SCRIPT_PATH})
+
+docker build ${DOCKER_PATH} --build-arg=IDG_TAG=${IDG_TAG}\
+                            --build-arg=DP3_TAG=${DP3_TAG}\
+                            --build-arg=LSMTool_TAG=${LSMTool_TAG}\
+                            --build-arg=LoSoTo_TAG=${LoSoTo_TAG}\
+                            --build-arg=STMAN_TAG=${STMAN_TAG}\
+                            --build-arg=Dysco_TAG=${Dysco_TAG}\
+                            --build-arg=TOIL_VERSION=${TOIL_VERSION}\
+                            -t lofareosc/lofar-pipeline
+
+docker build ${DOCKER_PATH} -f ${DOCKER_PATH}/Dockerfile_ci -t lofareosc/lofar-pipeline-ci
diff --git a/Docker/losoto.patch b/Docker/losoto.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fbdfb47754296d2b358e162afe777cd1e41fea75
--- /dev/null
+++ b/Docker/losoto.patch
@@ -0,0 +1,13 @@
+---  /src/losoto/losoto/operations/__init__.py      2019-11-07 12:43:46.220577945 +0000
++++  /src/losoto/losoto/operations/__init__.py      2019-11-07 12:43:34.401765786 +0000
+@@ -2,8 +2,7 @@
+ 
+ __all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py") if f[0] != '_']
+ 
+-for x in __all__:
+-    __import__(x, locals(), globals())
++from . import *
+ 
+ class Timer(object):
+     """
+
diff --git a/Docker/skymodels.tar.gz.REMOVED.git-id b/Docker/skymodels.tar.gz.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..e2362e5aa6bd4e3fe266bd71966dee96de2449ae
--- /dev/null
+++ b/Docker/skymodels.tar.gz.REMOVED.git-id
@@ -0,0 +1 @@
+2377705b2f6824c2a1bd59ddabfe5647a981f83e
\ No newline at end of file
diff --git a/Docker/test_data/A-Team_lowres.sourcedb b/Docker/test_data/A-Team_lowres.sourcedb
new file mode 100644
index 0000000000000000000000000000000000000000..b4e89906093cc01438b6a7b81f3ea9bfb06ba520
Binary files /dev/null and b/Docker/test_data/A-Team_lowres.sourcedb differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..3670600f2692d3b4b77cc07eddbdb44261d3c214
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..811482a52b56513bf3d8dc5c6083549f8092b2c0
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/ANTENNA/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..20ab416e6b2089d0bb7ed946963b87aa3a535c04
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..bc76518f7b4e25a64bb5a1e2570ddf4df13bfffa
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/DATA_DESCRIPTION/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..08041c586fc1cdae160f90e7234b95baa35b18f8
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..2a2ba196d7a2a608270dd2ce05896abbd1bc3fc6
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..59ef50ecf03311aabb897346169b2ca04e874254
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FEED/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..51bf40ea2f1d0e463019ed6e3f3a111f05309ce4
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..85defe9931c79cf71617a32c6cb8d712339260aa
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..bb9a3f1cc36a284642d65c5f733c2f333f975e99
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FIELD/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..360359641eafdad08c4c32e80d43b7af36c1328a
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..acf64ff0cee834d15e3054ae8c3bab48645789f0
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/FLAG_CMD/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..fce2d0ed9c73849ca8b1fe90f8fd4bd118a6671e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..2156633a62feafe8d17c140f2a1f4636670511d1
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..6e709e7a4fef28bff98f0eac7806aafbaafb3a85
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/HISTORY/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..bc9a355ad27c4dbc51e94ed910ab7f572e16a578
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..fad4cc47eaab9825cca50ae6fc5fdcbaedc828f8
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..9bcba53e53d7e6d618d837ebe3a8c1bb77b48ea2
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ANTENNA_FIELD/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..9ba0c7141eed0faa82b9afc1ea616ffea109bdf9
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..a890c6a767ea4d04d226092c34457cccd9f04000
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_ELEMENT_FAILURE/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..07e024d0a4f85176f62a37b2ed66cd42667f10f7
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..0a4478675199281251b78a13a770e1a7c1383edc
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/LOFAR_STATION/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e51b8f283d20f6d0e00166c2689297f87865e40d
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..a6ea794cfbb9b734fe866f6dd998f771c8b702e9
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/OBSERVATION/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..514b7b9136fab8d2b4bffcd379588330974dab89
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..7c4e0b3ba494f51fb1fcc5f43305c92697a9d062
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..58715d9bac6e3dd1229c3a3e78c5aede36c34b9d
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POINTING/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..15d239d1be0e401e157d39b9a204533cbd948ad9
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..d487c40cb0089a9062007bdf010a13075950f19d
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..247a4aff500069af7c07dbcd0073a7299984dba3
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/POLARIZATION/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..7a2b0a8e519f8082715a83d168243a717ad3a544
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..b78be96341e9baa7b8afea51e0d526f7c365eb06
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/PROCESSOR/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..66891e1254c8625436f0a79978d094e88bb1f9d0
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..9d0dd62f6e87d1e6ae22f8fb7dd9e363df7361b8
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_BASELINE_STATISTIC/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..534ab977cdbfd6c21726bdb52e78ca8f765cfabc
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..6b4995c6cebf3a47ad41f96907d10c4d817696f6
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_FREQUENCY_STATISTIC/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..5ab547b065b59ee35f5f75b4cb971c7850560324
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..b970716f71e6adc2ccd8079da078b19fa229b810
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_KIND_NAME/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..638f3dd45f2c2e45f24c7638de10b581c8b2129f
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..40f3c17a4924760e9be56d6b5bbdb3809aea5cf6
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/QUALITY_TIME_STATISTIC/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f4cd2bc15998b2583474b25a88c4e253a2fdd249
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..6489aad3aa55d3c4a9799f7351635f5076b107d7
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0i
new file mode 100644
index 0000000000000000000000000000000000000000..7f3944944fa4e5e33c75c0959274bcf3c95a979f
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.f0i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/SPECTRAL_WINDOW/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e83d60922df567c9b906d353e590114d0f06ed9e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..a3e1ee3d9b6c1c0d1ca4c4089a5c1105d3060cd4
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..a1a976ed49439abda34d2c64cfd0360cfcdef651
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.info
@@ -0,0 +1,3 @@
+Type = 
+SubType = 
+
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0472b61a97b3474a8587d7db73c4914e1104166e
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/STATE/table.lock differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.dat b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.dat
new file mode 100644
index 0000000000000000000000000000000000000000..fdb2a941e91645871bb6b836fc2952f499e2c509
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.dat differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f0
new file mode 100644
index 0000000000000000000000000000000000000000..fbc772f920efcd59df4b726f48ec68c621c73f85
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1
new file mode 100644
index 0000000000000000000000000000000000000000..0b21992bc5062953e70c5b9bd5b08c292b161441
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1i b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1i
new file mode 100644
index 0000000000000000000000000000000000000000..2308328019d48cc87144699973b89461338d1a0b
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f1i differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2
new file mode 100644
index 0000000000000000000000000000000000000000..15c5ebbdf772ebe0bcc4c233905345afea749e51
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2_TSM0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2_TSM0
new file mode 100644
index 0000000000000000000000000000000000000000..d0be7c43dc806e8e9c2cacab6062eb9f8c01c241
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f2_TSM0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3
new file mode 100644
index 0000000000000000000000000000000000000000..a72b78ccd766304c88ebbdaa83d50a6a1012c3d8
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3_TSM0.REMOVED.git-id b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3_TSM0.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..e5c61f434f829fb218f5c674e4e1d142717c1ede
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f3_TSM0.REMOVED.git-id
@@ -0,0 +1 @@
+7637ff184c49f778fa3641fbc6548d043393cd86
\ No newline at end of file
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4
new file mode 100644
index 0000000000000000000000000000000000000000..e598c71dd69b1f060fae01b0642b8c24a3f5d9c0
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4_TSM0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4_TSM0
new file mode 100644
index 0000000000000000000000000000000000000000..614ee4b023cd4f57066a1b8d6264ac3cf88aaaad
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f4_TSM0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5
new file mode 100644
index 0000000000000000000000000000000000000000..3b4b570d2e2ab2a20fdaa61eb1d4b41725d30fd9
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5_TSM0 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5_TSM0
new file mode 100644
index 0000000000000000000000000000000000000000..5a8f3fadec9e2a3cc53886a0dbf8b7f966f4d20f
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f5_TSM0 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6
new file mode 100644
index 0000000000000000000000000000000000000000..d7d657412e746495a916cd47adf4b13ca2373497
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6_TSM0.REMOVED.git-id b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6_TSM0.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..3ea3217072e12722bffbde57d4ba11baf5bf27d2
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f6_TSM0.REMOVED.git-id
@@ -0,0 +1 @@
+10891d14e7571d21ec73dd29362401082041c711
\ No newline at end of file
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7 b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7
new file mode 100644
index 0000000000000000000000000000000000000000..92e945567782b8c27f4076795be9b77022ce2fc7
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7 differ
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7_TSM0.REMOVED.git-id b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7_TSM0.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..38eb0c84b1e63548143a97f65b3a3f4176db1ea0
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.f7_TSM0.REMOVED.git-id
@@ -0,0 +1 @@
+2dedb806a06539078faf5e62c82a98b21dc512b8
\ No newline at end of file
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.info b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.info
new file mode 100644
index 0000000000000000000000000000000000000000..105af65c13868a224843eb0cb3596828614e8fd0
--- /dev/null
+++ b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.info
@@ -0,0 +1,5 @@
+Type = Measurement Set
+SubType = 
+
+This is a MeasurementSet Table holding measurements from a Telescope
+This is a LOFAR MeasurementSet Table
diff --git a/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.lock b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.lock
new file mode 100644
index 0000000000000000000000000000000000000000..c0c07ecaa3d0c0ff6d59a423b8d0e752b7070563
Binary files /dev/null and b/Docker/test_data/L570745_SB001_uv_MODEL.MS/table.lock differ
diff --git a/Docker/test_data/example.h5.REMOVED.git-id b/Docker/test_data/example.h5.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..ee55446f16fed96380113889ea423eb37e2bdbd0
--- /dev/null
+++ b/Docker/test_data/example.h5.REMOVED.git-id
@@ -0,0 +1 @@
+554933b577a0dcf1b2aa3fa91c7de5b2477fd724
\ No newline at end of file
diff --git a/steps/AOFlagger.cwl b/steps/AOFlagger.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..e3421e14bc87cb1c9615f4e21f6a981a2849ebc8
--- /dev/null
+++ b/steps/AOFlagger.cwl
@@ -0,0 +1,121 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: aoflagger
+
+requirements:
+  - class: InlineJavascriptRequirement
+  - class: InitialWorkDirRequirement
+    listing:
+      - entry: $(inputs.msin)
+        writable: true
+
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
+
+baseCommand:
+  - aoflagger
+inputs:
+  - id: msin
+    type: Directory[]
+    doc: Input measurement set
+    inputBinding:
+      position: 0
+  - id: verbose
+    type: boolean?
+
+    doc: will produce verbose output
+    inputBinding:
+      valueFrom: -v
+  - id: n_threads
+    type: int?
+    doc: |
+      overrides the number of threads specified in the strategy
+      (default: one thread for each CPU core)
+    inputBinding:
+      prefix: -j
+
+  - id: strategy
+    type: File?
+    doc: |
+      specifies a customized strategy
+    inputBinding:
+      prefix: -strategy
+
+#### READ MODES
+  - id: direct_read
+    type: boolean?
+    doc: |
+      Will perform the slowest IO but will always work.
+    inputBinding:
+      prefix: -direct-read
+  - id: indirect_read
+    type: boolean?
+    doc: |
+      Will reorder the measurement set before starting, which is normally
+      faster but requires free disk space to reorder the data to.
+    inputBinding:
+      prefix: -indirect-read
+  - id: memory_read
+    type: boolean?
+    doc: |
+      Will read the entire measurement set in memory. This is the fastest,
+      but requires much memory.
+    inputBinding:
+      prefix: -memory-read
+  - id: auto_read
+    type: boolean?
+    doc: |
+       Will select either memory or direct mode based on available memory (default).
+    inputBinding:
+      prefix: -auto-read
+##############
+  - id: skip_flagged
+    type: boolean?
+    doc: |
+      Will skip an ms if it has already been processed by AOFlagger according
+      to its HISTORY table.
+    inputBinding:
+      prefix: -skip-flagged
+  - id: uvw
+    type: File?
+    doc: Reads uvw values (some exotic strategies require these)
+    inputBinding:
+      prefix: -uvw
+  - id: column
+    type: string?
+    doc: Specify column to flag
+    inputBinding:
+      prefix: -column
+  - id: bands
+    type: int[]?
+    doc: Comma separated list of (zero-indexed) band ids to process
+    inputBinding:
+      prefix: -bands
+      itemSeparator: ','
+  - id: fields
+    type: int[]?
+    doc: Comma separated list of (zero-indexed) field ids to process
+    inputBinding:
+      prefix: -fields
+      itemSeparator: ','
+  - id: combine-spws
+    type: boolean?
+    doc: Join all SPWs together in frequency direction before flagging
+    inputBinding:
+      prefix: -combine-spws
+  - id: bandpass
+    type: File?
+    doc: Set bandpass correction file for any 'Apply passband' action
+    inputBinding:
+      prefix: bandpass
+
+outputs:
+  - id: output_ms
+    doc: Output image
+    type: Directory[]
+    outputBinding:
+      outputEval: $(inputs.msin)
+label: AOFlagger
diff --git a/steps/DP3.AOFlaggerStepGenerator.cwl b/steps/DP3.AOFlaggerStepGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..2a70f602771d7e5e669ba46ee395550807bb379d
--- /dev/null
+++ b/steps/DP3.AOFlaggerStepGenerator.cwl
@@ -0,0 +1,132 @@
+#!/usr/bin/env cwl-runner
+
+class: Workflow
+cwlVersion: v1.0
+id: aoflagger_step_generator
+
+inputs:
+  - id: steps
+    type: Any[]?
+    default: []
+  - id: step_name
+    type: string
+    doc: unique name for the step
+    default: aoflag
+  - id: count.save
+    type: boolean
+    default: false
+    doc: >-
+      If true, the flag percentages per frequency are saved to a table with
+      extension .flagfreq and percentages per station to a table with extension
+      .flagstat. The basename of the table is the MS name (without extension)
+      followed by the stepname and extension.
+  - id: count.path
+    type: string
+    default: ""
+    doc: >-
+      The directory where to create the flag percentages table. If empty, the
+      path of the input MS is used.
+  - id: strategy
+    type: File?
+    doc: >-
+      The name of the strategy file to use. If no name is given, the default
+      strategy is used which is fine for HBA. For LBA data the strategy
+      LBAdefault should be used.
+  - id: memoryperc
+    type: int
+    default: 0
+    doc: >-
+      If >0, percentage of the machines memory to use. If memorymax nor
+      memoryperc is given, all memory will be used (minus 2 GB (at most 50%) for
+      other purposes). Accepts only integer values (LOFAR v2.16). Limiting the
+      available memory too much affects flagging accuracy; in general try to use
+      at least 10 GB of memory.
+  - id: memorymax
+    type: double
+    default: 0
+    doc: >-
+      Maximum amount of memory (in GB) to use. ⇐0 means no maximum. As stated
+      above, this affects flagging accuracy.
+  - id: timewindow
+    type: int
+    default: 0
+    doc: >-
+      Number of time slots to be flagged jointly. The larger the time window,
+      the better the flagging performs. 0 means that it will be deduced from the
+      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
+    default: 0
+    doc: >-
+      If >0, percentage of time window to be added to the left and right side
+      for overlap purposes (to minimize boundary effects). If overlapmax is not
+      given, it defaults to 1%.
+  - id: overlapmax
+    type: int
+    default: 0
+    doc: Maximum overlap value (0 is no maximum).
+  - id: autocorr
+    type: boolean
+    default: true
+    doc: Flag autocorrelations?
+  - id: pulsar
+    type: boolean
+    default: false
+    doc: Use flagging strategy optimized for pulsar observations?
+  - id: pedantic
+    type: boolean
+    default: false
+    doc: Be more pedantic when flagging?
+  - id: keepstatistics
+    type: boolean
+    default: true
+    doc: Write the quality statistics?
+outputs:
+  - id: augmented_steps
+    outputSource:
+      - DP3_GenericStep/augmented_steps
+    type: Any[]
+
+steps:
+  - id: DP3_GenericStep
+    in:
+      - id: step_type
+        default: 'aoflagger'
+      - id: step_id
+        source: step_name
+      - id: steps
+        source: steps
+      - id: parameters
+        valueFrom: $(inputs)
+      - id: count.save
+        source: count.save
+      - id: count.path
+        source: count.save
+      - id: strategy
+        source: strategy
+      - id: memoryperc
+        source: memoryperc
+      - id: memorymax
+        source: memorymax
+      - id: timewindow
+        source: timewindow
+      - id: overlapperc
+        source: overlapperc
+      - id: overlapmax
+        source: overlapmax
+      - id: autocorr
+        source: autocorr
+      - id: pulsar
+        source: pulsar
+      - id: pedantic
+        source: pedantic
+      - id: keepstatistics
+        source: keepstatistics
+    out:
+      - augmented_steps
+    run: ../steps/DP3.GenericStep.cwl
+requirements:
+  - class: StepInputExpressionRequirement
+  - class: InlineJavascriptRequirement
+  - class: MultipleInputFeatureRequirement
diff --git a/steps/DP3.AveragerStepGenerator.cwl b/steps/DP3.AveragerStepGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..d5424919111a6c38f65053bfec5f2e299a98c076
--- /dev/null
+++ b/steps/DP3.AveragerStepGenerator.cwl
@@ -0,0 +1,85 @@
+#!/usr/bin/env cwl-runner
+
+class: Workflow
+cwlVersion: v1.0
+id: average_step_generator
+
+inputs:
+  - id: steps
+    type: Any[]?
+    default: []
+  - id: step_name
+    type: string
+    doc: unique name for the step
+    default: average
+  - id: timestep
+    type: int
+    doc: >-
+      Number of time slots to average. It is truncated if exceeding the actual
+      number of times.
+    default: 1
+  - id: freqstep
+    type: int
+    doc: >-
+      Number of channels to average. It is truncated if exceeding the actual
+      number of channels.
+    default: 1
+  - id: minpoints
+    type: int
+    doc: >-
+      If number of averaged unflagged input points < minpoints, the averaged
+      point is flagged.
+    default: 0
+  - id: minperc
+    type: float
+    doc: 'Like minpoints, but expressed as a percentage of timestep*freqstep.'
+    default: 0
+  - id: timeresolution
+    type: float
+    doc: >-
+      Target time resolution, in seconds. If this is given, and bigger than
+      zero, it overrides <step>.timestep
+    default: 0
+  - id: freqresolution
+    type: float
+    doc: >-
+      Target frequency resolution, in Hz (or append "MHz" or "kHz" to specify it
+      in those units). If this is given, and bigger than zero, it overrides
+      <step>.freqstep
+    default: 0
+outputs:
+  - id: augmented_steps
+    outputSource:
+      - DP3_GenericStep/augmented_steps
+    type: Any[]
+
+steps:
+  - id: DP3_GenericStep
+    in:
+      - id: step_type
+        default: 'averager'
+      - id: step_id
+        source: step_name
+      - id: steps
+        source: steps
+      - id: parameters
+        valueFrom: $(inputs)
+      - id: timestep
+        source: timestep
+      - id: freqstep
+        source: freqstep
+      - id: minpoints
+        source: minpoints
+      - id: minperc
+        source: minperc
+      - id: timeresolution
+        source: timeresolution
+      - id: freqresolution
+        source: freqresolution
+    out:
+      - augmented_steps
+    run: ../steps/DP3.GenericStep.cwl
+requirements:
+  - class: StepInputExpressionRequirement
+  - class: InlineJavascriptRequirement
+  - class: MultipleInputFeatureRequirement
diff --git a/steps/DP3.DemixerStepGenerator.cwl b/steps/DP3.DemixerStepGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..c88bdd1721d9a544f872ef89f814c361eb56dee5
--- /dev/null
+++ b/steps/DP3.DemixerStepGenerator.cwl
@@ -0,0 +1,190 @@
+#!/usr/bin/env cwl-runner
+
+class: Workflow
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: demix_step_generator
+
+inputs:
+  - id: steps
+    type: Any[]?
+    default: []
+  - id: step_name
+    type: string
+    doc: unique name for the step
+    default: demix
+  - id: baseline
+    default: ""
+    type: string
+    doc: Baselines to demix. See Description of baseline selection parameters.
+  - id: blrange
+    default: []
+    type: double[]
+    doc: Baselines to demix. See Description of baseline selection parameters.
+  - id: corrtype
+    default: cross
+    type: string
+    doc: >-
+      Baselines to demix. Correlation type to match? Must be auto, cross, or an
+      empty string.
+  - id: timestep
+    default: 1
+    type: int
+    doc: >-
+      Number of time slots to average when subtracting. It is truncated if
+      exceeding the actual number of times. Note that the data itself will also
+      be averaged by this amount.
+  - id: freqstep
+    default: 1
+    type: int
+    doc: >-
+      Number of channels to average when subtracting. It is truncated if
+      exceeding the actual number of channels. Note that the data itself will
+      also be averaged by this amount.
+  - id: demixtimestep
+    default: 0
+    type: int
+    doc: >-
+      Number of time slots to average when demixing. It is truncated if
+      exceeding the actual number of times. It defaults to the averaging used
+      for the subtract.
+  - id: demixfreqstep
+    default: 0
+    type: int
+    doc: >-
+      Number of channels to average when demixing. It is truncated if exceeding
+      the actual number of channels. It defaults to the averaging used for the
+      subtract.
+  - id: ntimechunk
+    default: null
+    type: int
+    doc: >-
+      Number of demix time slots (after averaging) that are processed jointly in
+      as much a parallel way as possible. If subtract uses different time
+      averaging, it has to fit integrally.
+  - id: skymodel
+    default: sky
+    type: [File, Directory, string]
+    doc: The name of the SourceDB to use (i.e., the output of makesourcedb).
+  - id: instrumentmodel
+    default: instrument
+    type: string
+    doc: >-
+      The name of the ParmDB to use. The ParmDB does not need to exist. If it
+      does not exist it will be created.
+  - id: subtractsources
+    default: null
+    type: string[]?
+    doc: >-
+      Names of the sources to subtract. If none are given, demixing comes down
+      to averaging. The sources must exist as patches in the SourceDB.
+  - id: modelsources
+    default: []
+    type: string[]
+    doc: >-
+      Names of sources with models to take into account when solving. the
+      sources must exist as patches in the SourceDB. Note that the target should
+      NOT be part of this parameter. If a model of the target has to be used, it
+      has to be given in parameter targetsource.
+  - id: targetsource
+    default: ''
+    type: string
+    doc: >-
+      It can be used to specify the name of the source model of the target. If
+      given, the target source model (its patch in the SourceDB) is taken into
+      account when solving; in this case parameter othersources cannot be given.
+      It cannot be given if ignoretarget=true. If not given, the target is
+      projected away or ignored (depending on parameter ignoretarget).
+  - id: ignoretarget
+    default: false
+    type: boolean
+    doc: false = project the target source away; true = ignore the target
+  - id: othersources
+    default: []
+    type: string[]
+    doc: >-
+      Names of sources of which the direction is taken into account when
+      demixing by projecting the directions away. The direction needs to be
+      specified if the source is unknown (which is usually the case). It can be
+      done using parameters <step>.<sourcename>.phasecenter.
+  - id: propagatesolutions
+    default: true
+    type: boolean
+    doc: >-
+      If set to true, solutions of a time slot are used as initial values for
+      the next time slot. If set to false, the diagonal elements of the Jones
+      matrix are initialized to one and the off-diagonal elements to zero.
+  - id: defaultgain
+    default: 1
+    type: double
+    doc: >-
+      The default and initial gain for the directional gains that are computed
+      internally.
+  - id: maxiter
+    default: 50
+    type: int
+    doc: Maximum number of iterations used in the LM solve
+outputs:
+- id: augmented_steps
+  outputSource:
+    - DP3_GenericStep/augmented_steps
+  type: Any[]
+
+steps:
+  - id: DP3_GenericStep
+    in:
+    - id: steps
+      source: steps
+    - id: output_files
+      default: ["instrumentmodel"]
+
+    - id: parameters
+      valueFrom: $(inputs)
+    - id: step_id
+      source: step_name
+    - id: step_type
+      default: 'demixer'
+    - id: baseline
+      source: baseline
+    - id: blrange
+      source: blrange
+    - id: corrtype
+      source: corrtype
+    - id: timestep
+      source: timestep
+    - id: freqstep
+      source: freqstep
+    - id: demixtimestep
+      source: demixtimestep
+    - id: demixfreqstep
+      source: demixfreqstep
+    - id: ntimechunk
+      source: ntimechunk
+    - id: skymodel
+      source: skymodel
+    - id: instrumentmodel
+      source: instrumentmodel
+    - id: subtractsources
+      source: subtractsources
+    - id: modelsources
+      source: modelsources
+    - id: targetsource
+      source: targetsource
+    - id: ignoretarget
+      source: ignoretarget
+    - id: othersources
+      source: othersources
+    - id: propagatesolutions
+      source: propagatesolutions
+    - id: defaultgain
+      source: defaultgain
+    - id: maxiter
+      source: maxiter
+    out:
+      - augmented_steps
+    run: ../steps/DP3.GenericStep.cwl
+requirements:
+  - class: StepInputExpressionRequirement
+  - class: InlineJavascriptRequirement
+  - class: MultipleInputFeatureRequirement
diff --git a/steps/DP3.EmptyParsetGenerator.cwl b/steps/DP3.EmptyParsetGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..f3e2c175ced26ad327e9d56e473bbaf0039996a5
--- /dev/null
+++ b/steps/DP3.EmptyParsetGenerator.cwl
@@ -0,0 +1,25 @@
+#!/usr/bin/env cwl-runner
+
+cwlVersion: v1.0
+class: CommandLineTool
+id: empty_parset_generator
+baseCommand: [echo, 'steps=[]']
+
+requirements:
+  InlineJavascriptRequirement: {}
+
+inputs: []
+
+stdout: output_parset
+outputs:
+  - id: output_parset
+    doc: Empty parset file
+    streamable: True
+    type: File
+    outputBinding:
+        glob: output_parset
+  - id: output_secondary_files
+    doc: files needed to execute the step
+    type: File[]
+    outputBinding:
+      outputEval: $([])
diff --git a/steps/DP3.Execute.cwl b/steps/DP3.Execute.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..bf15ea45d9ac61ab6d23521605ea0955324e7e45
--- /dev/null
+++ b/steps/DP3.Execute.cwl
@@ -0,0 +1,79 @@
+class: Workflow
+cwlVersion: v1.0
+id: dp3_execute
+label: DP3.Execute
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+inputs:
+  - id: msout_name
+    type: string
+    'sbg:x': -425.39886474609375
+    'sbg:y': 127
+  - id: msin
+    type: Directory
+    'sbg:x': -254.39886474609375
+    'sbg:y': 242
+  - id: steps
+    type: 'Any[]?'
+    'sbg:x': -518.3988647460938
+    'sbg:y': -88
+outputs:
+  - id: secondary_output_files
+    outputSource:
+      - dppp/secondary_output_files
+    type: Any
+    'sbg:x': 213.60113525390625
+    'sbg:y': -184
+  - id: secondary_output_directories
+    outputSource:
+      - dppp/secondary_output_directories
+    type: Any
+    'sbg:x': 248.60113525390625
+    'sbg:y': -47
+  - id: msout
+    outputSource:
+      - dppp/msout
+    type: Directory
+    'sbg:x': 224.60113525390625
+    'sbg:y': 130
+steps:
+  - id: generic_step
+    in:
+      - id: steps
+        source:
+          - steps
+    out:
+      - id: parset
+      - id: input_files
+      - id: input_directories
+      - id: output_file_names
+      - id: output_directory_names
+    run: ./DP3.ParsetGenerator.cwl
+    'sbg:x': -294
+    'sbg:y': -84
+  - id: dppp
+    in:
+      - id: parset
+        source: generic_step/parset
+      - id: msin
+        source: msin
+      - id: msout_name
+        source: msout_name
+      - id: secondary_files
+        source:
+          - generic_step/input_files
+      - id: secondary_directories
+        source:
+          - generic_step/input_directories
+      - id: output_file_names
+        source: generic_step/output_file_names
+      - id: output_directory_names
+        source: generic_step/output_directory_names
+    out:
+      - id: msout
+      - id: secondary_output_files
+      - id: secondary_output_directories
+    run: ./DPPP.cwl
+    'sbg:x': 26
+    'sbg:y': -46
+requirements: []
diff --git a/steps/DP3.GenericStep.cwl b/steps/DP3.GenericStep.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..38829da42ed0deaac51bcf92c7c105e9139d4108
--- /dev/null
+++ b/steps/DP3.GenericStep.cwl
@@ -0,0 +1,63 @@
+#!/usr/bin/env cwl-runner
+
+cwlVersion: v1.0
+class: ExpressionTool
+id: generic_step
+
+requirements:
+  - class: InlineJavascriptRequirement
+
+inputs:
+  - id: steps
+    type: Any[]
+
+  - id: parameters
+    type: Any?
+
+outputs:
+  - id: augmented_steps
+    type: Any[]
+expression: |-
+  ${
+   var step_type = inputs.parameters.step_type;
+   var step_id = inputs.parameters.step_id;
+
+   var output_file_type = inputs.parameters.output_files;
+   var output_files = {}
+
+   for(var index in output_file_type){
+     var file_type = output_file_type[index]
+     if(file_type != undefined && file_type != null){
+       output_files[file_type] = inputs.parameters[file_type]
+     }
+   }
+
+   var input_secondary_files = inputs.parameters.input_secondary_files;
+
+   delete inputs.parameters.step_type;
+   delete inputs.parameters.step_id;
+   delete inputs.parameters.steps;
+   delete inputs.parameters.parameters;
+   delete inputs.parameters.steps;
+
+
+   var new_step = {'step_type': step_type,
+                   'step_id': step_id,
+                   'parameters': inputs.parameters,
+                   'output_files': output_files};
+
+
+   var in_parameters = inputs.steps;
+
+   // Checks if the step_id is duplicate if so raised an exception
+   var step_ids = []
+   for(var step in in_parameters){
+     step = in_parameters[step]
+     step_ids.push(step.step_id)
+   }
+   if(step_ids.indexOf(step_id) >= 0) throw 'step_id has to be unique'
+
+   var out_parameters =  in_parameters == null ? [new_step] : in_parameters.concat(new_step)
+
+   return {'augmented_steps': out_parameters};
+  }
diff --git a/steps/DP3.ParsetGenerator.cwl b/steps/DP3.ParsetGenerator.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..f5837e9a3528135180143bee7fb406ef736b1efb
--- /dev/null
+++ b/steps/DP3.ParsetGenerator.cwl
@@ -0,0 +1,148 @@
+#!/usr/bin/env cwl-runner
+
+cwlVersion: v1.0
+class: CommandLineTool
+id: generic_step
+
+requirements:
+  - class: InlineJavascriptRequirement
+
+baseCommand:
+  - python3
+
+arguments:
+ - prefix: -c
+   valueFrom: |
+        import sys
+
+        true = True
+        false = False
+        null = None
+        steps_list = $(inputs.steps)
+        steps_id_list = list(map(lambda item: item['step_id'], steps_list))
+
+        for step in steps_list:
+            try:
+                step_id = step.get('step_id')
+                step_type = step.get('step_type')
+                parameters = step.get('parameters')
+
+
+                line = '.'.join([step_id, 'type'])
+                line += '=%s' % step_type
+                print(line)
+
+                for parameter_name, parameter in parameters.items():
+                    if isinstance(parameter, dict):
+                        if parameter['class'] in ['File', 'Directory']:
+                            parameter = parameter['basename']
+                        else:
+                            raise NotImplemented()
+                    if parameter is None:
+                        continue
+                    line = '.'.join([step_id, parameter_name])
+                    line = '%s=%s' % (line, parameter)
+
+                    print(line)
+            except KeyError as e:
+                print('invalid input for step ', step, ':', e)
+                sys.exit(1)
+        last_step_line = 'steps=[%s]' % ', '.join(steps_id_list)
+        print(last_step_line)
+inputs:
+  - id: steps
+    type: Any[]?
+
+outputs:
+  - id: parset
+    doc: Parset output file
+    type: File
+    outputBinding:
+      glob: parset
+  - id: input_files
+    doc: additional input files
+    type: File[]
+    outputBinding:
+      outputEval: |-
+        ${
+        var outfiles = []
+        for(var step in inputs.steps){
+          step = inputs.steps[step]
+          for(var parameter in step['parameters']){
+            parameter = step['parameters'][parameter]
+
+            if (parameter != null && parameter.class =='File'){
+              outfiles.push(parameter)
+            }
+          }
+        }
+        return outfiles
+        }
+  - id: input_directories
+    doc: additional input directory
+    type: Directory[]
+    outputBinding:
+      outputEval: |
+        ${
+        var outdirs = []
+        for(var step in inputs.steps){
+          step = inputs.steps[step]
+          for(var parameter in step['parameters']){
+            parameter = step['parameters'][parameter]
+            if (parameter != null && parameter.class=='Directory'){
+              outdirs.push(parameter)
+            }
+          }
+        }
+        return outdirs
+        }
+
+  - id: output_file_names
+    doc: expected output files
+    type: Any
+    outputBinding:
+      outputEval: |
+        ${
+        var out_names = {}
+        for(var step_idx in inputs.steps){
+          var step = inputs.steps[step_idx]
+          var step_id = step['step_id']
+          var step_dirs = {}
+          if(!step.hasOwnProperty("output_files")) continue;
+
+          var step_files = {}
+
+          for(var index in step['output_files']){
+            var file_id = index
+            var file_name = step['output_files'][file_id]
+            step_files[file_id] = file_name
+          }
+
+          out_names[step_id] = step_files
+        }
+        return out_names
+        }
+  - id: output_directory_names
+    doc: expected output directories
+    type: Any
+    outputBinding:
+      outputEval: |-
+        ${
+        var out_names = {}
+        for(var step_idx in inputs.steps){
+          var step = inputs.steps[step_idx]
+          var step_id = step['step_id']
+          var step_dirs = {}
+          if(!step.hasOwnProperty("output_directories")) continue;
+
+          for(var index in step['output_directories']){
+            var file_id = index
+            var file_name = step['output_directories'][file_id]
+            step_dirs[file_id] = file_name
+          }
+          out_names[step_id] = step_dirs
+        }
+        return out_names
+        }
+stdout:
+  parset
diff --git a/steps/DP3.PreflaggerStepGenerator.cwl b/steps/DP3.PreflaggerStepGenerator.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..03f6c11d6f16db4d72a38666e4a294a2f568fb28
--- /dev/null
+++ b/steps/DP3.PreflaggerStepGenerator.cwl
@@ -0,0 +1,246 @@
+#!/usr/bin/env cwl-runner
+
+class: Workflow
+cwlVersion: v1.0
+id: preflag_step_generator
+
+inputs:
+  - id: steps
+    type: Any[]?
+    default: []
+  - id: step_name
+    type: string
+    doc: unique name for the step
+    default: preflag
+  - id: count.save
+    default: false
+    type: boolean
+    doc: >-
+      If true, the flag percentages per frequency are saved to a table with
+      extension .flagfreq and percentages per station to a table with extension
+      .flagstat. The basename of the table is the MS name (without extension)
+      followed by the stepname and extension.
+  - id: count.path
+    type: string?
+    doc: >-
+      The directory where to create the flag percentages table. If empty, the
+      path of the input MS is used.
+  - id: mode
+    default: set
+    type: string
+    doc: >-
+      Case-insensitive string telling what to do with the flags of the data
+      matching (or not matching) the selection criteria given in the other
+      parameters.
+  - id: expr
+    default: ''
+    type: string?
+    doc: >-
+      Expression of preflagger keyword sets (see above). Operators AND, OR, and
+      NOT are possible (or their equivalents &&,&, ||, |, and !). Parentheses
+      can be used to change precedence order. For example:: c1 and (c2 or c3)
+  - default:
+    id: timeofday
+    type: string?
+    doc: >-
+      Ranges of UTC time-of-day given as st..end or val+-delta. Each value must
+      be given as 12:34:56.789, 12h34m56.789, or as a value followed by a unit
+      like h, min, or s.
+  - id: abstime
+    default: []
+    type: string[]
+    doc: >-
+      Ranges of absolute UTC date/time given as st..end or val+-delta. Each
+      value (except delta) must be given as a date/time in casacore MVTime
+      format, for instance 12-Mar-2010/11:31:00.000. A delta value must be given
+      as a time (for instance 1:30:0 or 20s).
+  - id: reltime
+    default: []
+    type: string[]
+    doc: >-
+      Ranges of times (using .. or +-) since the start of the observation. A
+      time can be given like 1:30:0 or 20s.
+  - id: timeslot
+    default: []
+    type: string[]
+    doc: >-
+      Time slot sequence numbers. First time slot is 0. st..end means end
+      inclusive.
+  - id: lst
+    default: []
+    type: string[]
+    doc: >-
+      Ranges of Local Apparent Sidereal Times like 1:30:0 +- 20min. The LST of a
+      time slot is calculated for the array position, thus not per antenna.
+  - id: azimuth
+    default: []
+    type: float[]
+    doc: >-
+      Ranges of azimuth angles given as st..end or val+-delta. Each value has to
+      be given as a casacore direction like 12:34:56.789 or 12h34m56.789,
+      12.34.56.789 or 12d34m56.789, or a value followed by a unit like rad or
+      deg.
+  - id: elevation
+    type: string?
+    doc: >-
+      Ranges of elevation angles (similar to azimuth). For example::
+      0deg..10deg
+  - id: baseline
+    default: []
+    type: string[]
+    doc: See Description of baseline selection parameters.
+  - id: corrtype
+    default: ''
+    type: string
+    doc: Correlation type to match? Must be auto, cross, or an empty string.
+  - id: blmin
+    default: -1
+    type: float
+    doc: If blmin > 0, baselines with length < blmin meter will match.
+  - id: blmax
+    default: -1
+    type: float
+    doc: If blmax > 0, baselines with length > blmax meter will match.
+  - id: uvmmin
+    default: -1
+    type: float
+    doc: >-
+      If uvmmin > 0, baselines with UV-distance < uvmmin meter will match. Note
+      that the UV-distance is the projected baseline length.
+  - id: uvmmax
+    default: -1
+    type: float
+    doc: If uvmmax > 0, baselines with UV-distance > uvmmax meter will match.
+  - id: freqrange
+    default: ''
+    type: string
+    doc: >-
+      Channels in the given frequency ranges will match. Each value in the
+      vector is a range which can be given as start..end or start+-delta. A
+      value can be followed by a unit like KHz. If only one value in a range has
+      a unit, the unit is also applied to the other value. If a range has no
+      unit, it defaults to MHz. For example: freqrange=[1.2 .. 1.4 MHz,
+      1.8MHz+-50KHz] flags channels between 1.2MHz and 1.4MHz and between
+      1.75MHz and 1.85MHz. The example shows that blanks can be used at will.
+  - id: chan
+    default: ''
+    type: string
+    doc: >-
+      The given channels will match (start counting at 0). Channels exceeding
+      the number of channels are ignored. Similar to msin, it is possible to
+      specify the channels as an expression of nchan. Furthermore, .. can be
+      used to specify ranges. For example: chan=[0..nchan/32-1,
+      31*nchan/32..nchan-1] to flag the first and last 2 or 8 channels
+      (depending on 64 or 256 channels in the observation).
+  - id: amplmin
+    default: -1e+30
+    type: float
+    doc: >-
+      Correlation data with amplitude < amplmin will match. It can be given per
+      correlation. For example, amplmin=[100,,,100] matches data points with XX
+      or YY amplitude < 100. The non-specified amplitudes get the default value.
+  - id: amplmax
+    default: 1e+30
+    type: float
+    doc: Correlation data with amplitude > amplmax will match.
+  - id: phasemin
+    default: -1e+30
+    type: float
+    doc: Correlation data with phase < phasemin (in radians) will match.
+  - id: phasemax
+    default: 1e+30
+    type: float
+    doc: Correlation data with phase > phasemax (in radians) will match.
+  - id: realmin
+    default: -1e+30
+    type: float
+    doc: Correlation data with real complex part < realmin will match.
+  - id: realmax
+    default: 1e+30
+    type: float
+    doc: Correlation data with real complex part > realmax will match.
+  - id: imagmin
+    default: -1e+30
+    type: float
+    doc: Correlation data with imaginary complex part < imagmin will match.
+  - id: imagmax
+    default: 1e+30
+    type: float
+    doc: Correlation data with imaginary complex part > imagmax will match.
+outputs:
+- id: augmented_steps
+  outputSource:
+    - DP3_GenericStep/augmented_steps
+  type: Any[]
+
+steps:
+  - id: DP3_GenericStep
+    in:
+      - id: step_type
+        default: 'preflagger'
+      - id: step_id
+        source: step_name
+      - id: steps
+        source: steps
+      - id: parameters
+        valueFrom: $(inputs)
+      - id: count.save
+        source: count.save
+      - id: count.path
+        source: count.path
+      - id: mode
+        source: mode
+      - id: expr
+        source: expr
+      - id: abstime
+        source: abstime
+      - id: reltime
+        source: reltime
+      - id: timeslot
+        source: timeslot
+      - id: lst
+        source: lst
+      - id: azimuth
+        source: azimuth
+      - id: elevation
+        source: elevation
+      - id: baseline
+        source: baseline
+      - id: corrtype
+        source: corrtype
+      - id: blmin
+        source: blmin
+      - id: blmax
+        source: blmax
+      - id: uvmmin
+        source: uvmmin
+      - id: uvmmax
+        source: uvmmax
+      - id: freqrange
+        source: freqrange
+      - id: chan
+        source: chan
+      - id: amplmin
+        source: amplmin
+      - id: amplmax
+        source: amplmax
+      - id: phasemin
+        source: phasemin
+      - id: phasemax
+        source: phasemax
+      - id: realmin
+        source: realmin
+      - id: realmax
+        source: realmax
+      - id: imagmin
+        source: imagmin
+      - id: imagmax
+        source: imagmax
+    out:
+      - augmented_steps
+    run: ../steps/DP3.GenericStep.cwl
+
+requirements:
+  - class: StepInputExpressionRequirement
+  - class: InlineJavascriptRequirement
+  - class: MultipleInputFeatureRequirement
diff --git a/steps/DP3.Selector.cwl b/steps/DP3.Selector.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..b50754a85ab040136df19917a0e01a5464e8c7c9
--- /dev/null
+++ b/steps/DP3.Selector.cwl
@@ -0,0 +1,24 @@
+class: ExpressionTool
+cwlVersion: v1.0
+id: selector
+inputs:
+  - id: select_a
+    type: boolean
+    doc: 'if true selects a_steps if false selects b_steps'
+  - id: a_steps
+    type: Any[]
+    default: []
+  - id: b_steps
+    type: Any[]
+    default: []
+outputs:
+  - id: selected_steps
+    type: Any
+expression: |
+  $(
+    {'selected_steps': inputs.select_a ? inputs.a_steps : inputs.b_steps}
+  )
+label: Selector
+
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/steps/DPPP.cwl b/steps/DPPP.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..70d824f02518f594ecf5d9b8975041b1febee5bc
--- /dev/null
+++ b/steps/DPPP.cwl
@@ -0,0 +1,89 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: dppp
+baseCommand:
+  - DPPP
+inputs:
+  - id: parset
+    type: File?
+    inputBinding:
+      position: -1
+  - id: msin
+    type: Directory?
+    inputBinding:
+      position: 0
+      prefix: msin=
+      separate: false
+    doc: Input Measurement Set
+  - default: out.MS
+    id: msout_name
+    type: string
+    inputBinding:
+      position: 0
+      prefix: msout=
+      separate: false
+    doc: Output Measurement Set
+  - id: secondary_files
+    type: 'File[]?'
+    doc: Secondary files needed for the step
+  - id: secondary_directories
+    type: 'Directory[]?'
+    doc: Secondary directories needed for the step
+  - id: output_file_names
+    type: Any
+    doc: Expected output file names
+  - id: output_directory_names
+    type: Any
+    doc: Expected output file names
+outputs:
+  - id: msout
+    doc: Output Measurement Set
+    type: Directory
+    outputBinding:
+      glob: '$(inputs.msout_name=="."?inputs.msin:inputs.msout_name)'
+  - id: secondary_output_files
+    doc: Secondary output files
+    type: Any
+    outputBinding:
+      outputEval: |-
+        ${
+          var output={}
+          for(var step_name in inputs.output_file_names){
+            var file_per_idx = inputs.output_file_names[step_name];
+            for(var file_idx in file_per_idx){
+                var file_name = file_per_idx[file_idx];
+
+                output[file_idx] = {'class':'File', 'path': file_name};
+            }
+          }
+          return output
+        }
+  - id: secondary_output_directories
+    doc: Secondary output directories
+    type: Any
+    outputBinding:
+      outputEval: |-
+        ${
+          var output={}
+          for(var step_name in inputs.output_directory_names){
+            var file_per_idx = inputs.output_directory_names[step_name];
+            for(var file_idx in file_per_idx){
+                var file_name = file_per_idx[file_idx];
+
+                output[file_idx] = {'class':'Directory', 'path': file_name};
+            }
+          }
+          return output
+        }
+  - id: logfile
+    type: File?
+    outputBinding:
+      glob: DPPP.log
+hints:
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor
+stdout: DPPP.log
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/steps/DirSelector.cwl b/steps/DirSelector.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..d5bd04038a703c3ecfbc5f07aa917892b87bd85d
--- /dev/null
+++ b/steps/DirSelector.cwl
@@ -0,0 +1,39 @@
+class: ExpressionTool
+cwlVersion: v1.0
+id: dirselector
+inputs:
+  - id: inputs
+    type: Any
+    doc: input files
+  - id: step_name
+    type: string
+    doc: >-
+      id of the step that generates the output file or directory
+      (e.g. 'demixstepgenerator')
+  - id: key_name
+    type: string
+    doc: >-
+      key of the parset that contains the name of the outputfile
+      (e.g. 'instrumentmodel')
+outputs:
+  - id: output
+    type: [Directory, 'Directory[]']
+
+expression: |
+  ${
+    var step_name = inputs.step_name
+    var key_name = inputs.key_name
+
+    if(inputs.inputs.hasOwnProperty(step_name)){
+       var inputs_per_step = inputs.inputs[step_name]
+       if(inputs_per_step.hasOwnProperty(key_name)){
+         return {'output': inputs_per_step[key_name]}
+       }
+    }
+    return {'output': []}
+
+  }
+label: DirSelector
+
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/steps/FileSelector.cwl b/steps/FileSelector.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..f935adca0125043812f663d913ef039819f6a52e
--- /dev/null
+++ b/steps/FileSelector.cwl
@@ -0,0 +1,31 @@
+class: ExpressionTool
+cwlVersion: v1.0
+id: fileselector
+inputs:
+  - id: inputs
+    type: Any
+    doc: input files
+  - id: step_name
+    type: string
+    doc: >-
+      id of the step that generates the output file or directory
+      (e.g. 'demixstepgenerator')
+  - id: key_name
+    type: string
+    doc: >-
+      key of the parset that contains the name of the outputfile
+      (e.g. 'instrumentmodel')
+outputs:
+  - id: output
+    type: File
+
+expression: |
+  ${
+    var step_name = inputs.step_name
+    var key_name = inputs.key_name
+    return {'output': inputs.inputs[step_name][key_name]}
+  }
+label: FileSelector
+
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/steps/H5ParmCollector.cwl b/steps/H5ParmCollector.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..e2e33e20acab94f1e092866d37a2086185e93530
--- /dev/null
+++ b/steps/H5ParmCollector.cwl
@@ -0,0 +1,70 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+
+id: h5parm_collector
+
+baseCommand:
+  - H5parm_collector.py
+inputs:
+  - id: h5parmFiles
+    type: 'File[]'
+    format: lofar:#H5Parm
+    inputBinding:
+      position: 0
+    doc: List of h5parm files
+  - default: sol000
+    id: insolset
+    type: string?
+    inputBinding:
+      position: 0
+      prefix: '--insolset'
+    doc: Input solset name
+  - default: output.h5
+    id: outh5parmname
+    type: string
+    doc: Output h5parm name
+  - id: squeeze
+    type: boolean
+    default: false
+    inputBinding:
+      position: 0
+      prefix: '-q'
+    doc: removes all axes with the length of 1
+  - default: true
+    id: verbose
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-v'
+    doc: verbose output
+  - default: true
+    id: clobber
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-c'
+    doc: overwrite output
+outputs:
+  - id: outh5parm
+    doc: Output h5parm
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.outh5parmname)
+  - id: log
+    type: File
+    outputBinding:
+      glob: $(inputs.outh5parmname)-parm_collector_output.log
+label: H5parm_collector
+hints:
+  - class: DockerRequirement
+    dockerPull: 'lofareosc/prefactor-ci:master'
+stdout: $(inputs.outh5parmname)-parm_collector_output.log
+requirements:
+  - class: InlineJavascriptRequirement
+
diff --git a/steps/LoSoTo.Abs.cwl b/steps/LoSoTo.Abs.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..43f5c28c5a5fd18157707d9ba273bd85c6620532
--- /dev/null
+++ b/steps/LoSoTo.Abs.cwl
@@ -0,0 +1,52 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_abs
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+doc: |
+  Take absolute value. Needed before smooth if amplitudes are negative!
+  WEIGHT: no need to be weight compliant
+
+requirements:
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: |
+          [abs]
+          soltab = $(inputs.soltab)
+          operation = ABS
+      - 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
+    format: lofar:#H5Parm
+  - id: soltab
+    type: string
+    doc: "Solution table"
+
+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/LoSoTo.Duplicate.cwl b/steps/LoSoTo.Duplicate.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..9111602fa6ebde8aaca0b425afeef3c3d1e39d75
--- /dev/null
+++ b/steps/LoSoTo.Duplicate.cwl
@@ -0,0 +1,56 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_duplicate
+
+doc: |
+  Duplicate a table
+
+requirements:
+  InlineJavascriptRequirement: {}
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: |
+          [duplicate]
+          soltab = $(inputs.soltab)
+          operation = DUPLICATE
+          $(inputs.soltabOut !== null? 'soltabOut=' + inputs.soltabOut: '')
+
+      - 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
+    format: lofar:#H5Parm
+  - id: soltab
+    type: string
+    doc: "Solution table"
+  - id: soltabOut
+    type: string?
+    doc: Output table name. By default choose next available from table type.
+outputs:
+  - id: output_h5parm
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/LoSoTo.Norm.cwl b/steps/LoSoTo.Norm.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..f60ee4c469c938e01c52b5d226e275bba4fe2a1f
--- /dev/null
+++ b/steps/LoSoTo.Norm.cwl
@@ -0,0 +1,61 @@
+#!/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
+    format: lofar:#H5Parm
+  - 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
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/LoSoTo.Plot.cwl b/steps/LoSoTo.Plot.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..e5d5cfb054bbda082cf00a311d9df0904ea22f1f
--- /dev/null
+++ b/steps/LoSoTo.Plot.cwl
@@ -0,0 +1,148 @@
+#!/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
+    format: lofar:#H5Parm
+  - 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"
+
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/LoSoTo.Replicateonaxis.cwl b/steps/LoSoTo.Replicateonaxis.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..c676467d19611e57252c17bdfd83b99d8a5fc821
--- /dev/null
+++ b/steps/LoSoTo.Replicateonaxis.cwl
@@ -0,0 +1,77 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_replicate_on_axis
+
+doc: |
+  Replace the values along a certain axis taking them from one specific axis
+  cell
+
+requirements:
+  InlineJavascriptRequirement: {}
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: "replicate_axis.py"
+        entry: |
+          import sys
+          from losoto.h5parm import openSoltab
+          from losoto.operations import replicateonaxis
+
+          soltab_address = "$(inputs.soltab)"
+          soltab = openSoltab(sys.argv[1], address=soltab_address)
+
+          axisReplicate = "$(inputs.axisReplicate)"
+          fromCell = "$(inputs.fromCell !== null ? inputs.fromCell : 0)"
+          updateWeights = "$(inputs.updateWeights? inputs.updateWeights : 'True')"
+
+          replicateonaxis.run(soltab, axisReplicate=axisReplicate,
+                                      fromCell=fromCell,
+                                      updateWeights=updateWeights)
+
+      - entryname: $(inputs.input_h5parm.basename)
+        entry: $(inputs.input_h5parm)
+        writable: true
+
+baseCommand: "python3"
+
+arguments:
+  - replicate_axis.py
+  - $(inputs.input_h5parm.basename)
+
+
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
+
+inputs:
+  - id: input_h5parm
+    type: File
+    format: lofar:#H5Parm
+  - id: soltab
+    type: string
+    doc: "Solution table"
+  - id: axisReplicate
+    type: string
+    doc: Axis along which replicate the values.
+  - id: fromCell
+    type: string?
+    doc: A cell value in axisReplicate from which to copy the data values.
+  - id: updateWeights
+    type: boolean?
+    doc: |
+      If False then weights are untouched, if True they are replicated
+      like data. Default: True.
+
+outputs:
+  - id: output_h5parm
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/LoSoTo.Reset.cwl b/steps/LoSoTo.Reset.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..99594d12046ee2d48622dda0e08de72e25c8efcd
--- /dev/null
+++ b/steps/LoSoTo.Reset.cwl
@@ -0,0 +1,57 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_reset
+
+doc: Subtract/divide two tables or a clock/tec/tec3rd/rm from a phase.
+
+requirements:
+  InlineJavascriptRequirement: {}
+  InitialWorkDirRequirement:
+    listing:
+      - entryname: 'parset.config'
+        entry: |
+          [reset]
+          soltab = $(inputs.soltab)
+          operation = RESET
+          $(inputs.dataVal !== null? 'dataVal=' + inputs.dataVal: '')
+
+      - 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
+    format: lofar:#H5Parm
+  - id: soltab
+    type: string
+    doc: "Solution table"
+  - id: dataVal
+    type: float?
+    doc: |
+      If given set values to this number, otherwise uses 1 for amplitude and 0
+      for all other soltab types.
+outputs:
+  - id: output_h5parm
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/LoSoTo.Residual.cwl b/steps/LoSoTo.Residual.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..4bc566cd7d878f8532d69cd74aad7a6d4a72bf8b
--- /dev/null
+++ b/steps/LoSoTo.Residual.cwl
@@ -0,0 +1,59 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: losoto_residual
+
+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
+    format: lofar:#H5Parm
+  - 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
+    format: lofar#H5Parm
+    outputBinding:
+      glob: $(inputs.input_h5parm.basename)
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/RadioDatatypes.yaml b/steps/RadioDatatypes.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0a1679541e2bf66a9bc447669dfd27a6d94c2ce1
--- /dev/null
+++ b/steps/RadioDatatypes.yaml
@@ -0,0 +1,8 @@
+type: array
+name: MeasurementSet
+label: The measurement set data location
+items:
+  - name: main_directory
+    type: Directory
+    inputBinding:
+      position: 0
diff --git a/steps/blsmooth.cwl b/steps/blsmooth.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..d139c594c6f1738109a4048f0abe7691c998d079
--- /dev/null
+++ b/steps/blsmooth.cwl
@@ -0,0 +1,91 @@
+class: CommandLineTool
+cwlVersion: v1.0
+id: blsmooth
+label: BLsmooth
+baseCommand:
+  - BLsmooth.py
+inputs:
+  - id: msin
+    type: Directory
+    inputBinding:
+      position: 1
+    doc: Input measurement set
+  - default: 0.2
+    id: ionfactor
+    type: float
+    inputBinding:
+      position: 0
+      prefix: '-f'
+    doc: Gives an indication on how strong is the ionosphere
+  - id: do_smooth
+    type: boolean
+    doc: 'If true performs smoothing'
+    inputBinding:
+      prefix: '--smooth=SMOOTH'
+
+  - default: 0.5
+    id: bscalefactor
+    type: float
+    inputBinding:
+      position: 0
+      prefix: '-s'
+    doc: Gives an indication on how the smoothing varies with
+  - default: DATA
+    id: in_column_name
+    type: string
+    inputBinding:
+      position: 0
+      prefix: '-i'
+    doc: Column name to smooth
+  - default: SMOOTHED_DATA
+    id: out_column
+    type: string
+    inputBinding:
+      position: 0
+      prefix: '-o'
+    doc: Output column
+  - default: false
+    id: weight
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-w'
+    doc: >-
+      Save the newly computed WEIGHT_SPECTRUM, this action permanently modify
+      the MS!
+  - default: false
+    id: restore
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-r'
+    doc: If WEIGHT_SPECTRUM_ORIG exists then restore it before smoothing
+  - default: false
+    id: nobackup
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-b'
+    doc: Do not backup the old WEIGHT_SPECTRUM in WEIGHT_SPECTRUM_ORIG
+  - default: false
+    id: onlyamp
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: '-a'
+    doc: Smooth only amplitudes
+outputs:
+  - id: msout
+    doc: MS set output
+    type: Directory
+    outputBinding:
+      glob: $(inputs.msin.basename)
+hints:
+ - class: DockerRequirement
+   dockerPull: lofareosc/prefactor-ci:master
+requirements:
+ - class: InitialWorkDirRequirement
+   listing:
+    - entry: $(inputs.msin)
+      writable: true
+ - class: InlineJavascriptRequirement
diff --git a/steps/check_ateam_separation.cwl b/steps/check_ateam_separation.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..977d9f86e63f3b003833aee677d330f1f188253d
--- /dev/null
+++ b/steps/check_ateam_separation.cwl
@@ -0,0 +1,44 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: check_ateam_separation
+baseCommand:
+  - python3
+  - /usr/local/bin/check_Ateam_separation.py
+inputs:
+  - id: ms
+    type:
+      - Directory
+      - type: array
+        items: Directory
+    inputBinding:
+      position: 0
+    doc: Input measurement set
+  - default: Ateam_separation.png
+    id: output_image_name
+    type: string?
+    inputBinding:
+      position: 2
+      prefix: '--outputimage'
+  - id: min_separation
+    type: int
+    inputBinding:
+      position: 1
+      prefix: '--min_separation'
+outputs:
+  - id: output_imag
+    doc: Output image
+    type: File?
+    outputBinding:
+      glob: $(inputs.output_image_name)
+  - id: logfile
+    type: File?
+    outputBinding:
+      glob: Ateam_separation.log
+label: check_Ateam_separation
+hints:
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor
+  - class: InlineJavascriptRequirement
+stdout: Ateam_separation.log
diff --git a/steps/ddecal.cwl b/steps/ddecal.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..c534d5362f563941d9503b980ae0dd6a4b766acf
--- /dev/null
+++ b/steps/ddecal.cwl
@@ -0,0 +1,111 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.0
+id: ddecal
+baseCommand: [DPPP]
+
+requirements:
+  InlineJavascriptRequirement: {}
+
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
+
+arguments:
+  - steps=[ddecal]
+  - ddecal.mode=rotation+diagonal
+  - ddecal.uvlambdamin=300
+  - ddecal.maxiter=50
+  - ddecal.nchan=1
+  - ddecal.solint=1
+  - ddecal.propagateconvergedonly=True
+  - ddecal.flagdivergedonly=True
+  - ddecal.tolerance=1.e-3
+  - ddecal.usemodelcolumn=True
+
+
+inputs:
+  - id: msin
+    type: Directory?
+    doc: Input Measurement Set
+    inputBinding:
+        prefix: msin=
+        separate: false
+
+  - id: msin_datacolumn
+    type: string
+    default: DATA
+    doc: Input data Column
+    inputBinding:
+        prefix: msin.datacolumn=
+        separate: false
+
+  - id: msin_modelcolum
+    type: string
+    default: MODEL_DATA
+    doc: Model data Column
+    inputBinding:
+        prefix: msin.modelcolumn=
+        separate: false
+
+  - id: output_name_h5parm
+    type: string
+    default: instrument.h5
+    inputBinding:
+        prefix: ddecal.h5parm=
+        separate: false
+  - id: msout_name
+    type: string
+    doc: Output Measurement Set
+    default: out.MS
+    inputBinding:
+        prefix: msout=
+        separate: false
+
+#--------------------
+  - id: propagate_solutions
+    type: boolean
+    default: true
+    inputBinding:
+      prefix: propagatesolutions=True
+  - id: flagunconverged
+    type: boolean
+    default: false
+    doc: |
+      Flag unconverged solutions (i.e., those from solves that did not converge
+      within maxiter iterations).
+    inputBinding:
+      prefix: flagdivergedonly=True
+  - id: flagdivergedonly
+    default: false
+    type: boolean
+    doc: |
+      Flag only the unconverged solutions for which divergence was detected.
+      At the moment, this option is effective only for rotation+diagonal
+      solves, where divergence is detected when the amplitudes of any station
+      are found to be more than a factor of 5 from the mean amplitude over all
+      stations.
+      If divergence for any one station is detected, all stations are flagged
+      for that solution interval. Only effective when flagunconverged=true
+      and mode=rotation+diagonal.
+    inputBinding:
+      prefix: flagdivergedonly=True
+outputs:
+  - id: msout
+    doc: Output Measurement Set
+    type: Directory
+    outputBinding:
+      glob: $(inputs.msout_name=="."?inputs.msin:inputs.msout_name)
+
+  - id: h5parm
+    doc: Filename of output H5Parm (to be read by e.g. losoto)
+    type: File
+    format: lofar:#H5Parm
+    outputBinding:
+      glob: $(inputs.output_name_h5parm)
+
+$namespaces:
+  lofar: https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
+$schema:
+  - https://git.astron.nl/eosc/ontologies/raw/master/schema/lofar.owl
diff --git a/steps/find_skymodel_cal.cwl b/steps/find_skymodel_cal.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..51a1dc4a8f7500fccac5cef763cd15d50ecaa505
--- /dev/null
+++ b/steps/find_skymodel_cal.cwl
@@ -0,0 +1,59 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: find_skymodel_cal_py
+baseCommand:
+  - python3
+inputs:
+    - id: msin
+      type: Directory
+      doc: MS containing the calibrator
+      inputBinding:
+        position: 0
+    - id: skymodels
+      type: Directory
+      doc: Directory containing the sky models
+    - id: skymodels_extension
+      type: string?
+      doc: path extension of the sky models
+
+label: find_skymodel_cal.py
+arguments:
+  - '-c'
+  - |
+    import sys
+
+    from unittest.mock import MagicMock
+    sys.modules['lofarpipe.support.data_map'] = MagicMock()
+
+
+    from find_skymodel_cal import main as find_skymodel
+    import json
+    mss = sys.argv[1:]
+    skymodels = "$(inputs.skymodels.path)"
+
+    extension = "$(inputs.skymodels_extension)"
+    output = {}
+    if extension != 'null':
+        output = find_skymodel(mss, skymodels, './', extension)
+    else:
+        output = find_skymodel(mss, skymodels, './')
+
+    cwl_output = {'class': 'File', 'path': output['SkymodelCal']}
+    with open('./out.json', 'w') as fp:
+        json.dump(cwl_output, fp)
+outputs:
+  - id: output_models
+    type: File
+    outputBinding:
+        loadContents: true
+        glob: 'out.json'
+        outputEval: $(JSON.parse(self[0].contents))
+
+requirements:
+  - class: InlineJavascriptRequirement
+
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
diff --git a/steps/interpolate_visibilities.cwl b/steps/interpolate_visibilities.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..90772b4f072cdecd9f03fd5f1d6258b66b995d11
--- /dev/null
+++ b/steps/interpolate_visibilities.cwl
@@ -0,0 +1,52 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: interpolate_visibilities
+
+baseCommand:
+  - DPPP
+arguments:
+  - msout.datacolumn=INTERP_DATA
+  - msout=.
+  - msin.datacolumn=DATA
+  - steps=[interpolate]
+inputs:
+  - id: msin
+    type: Directory
+    inputBinding:
+      prefix: 'msin='
+      separate: false
+  - id: storage_manager
+    type: string
+    default: Dysco
+    inputBinding:
+      separate: false
+      prefix: 'msout.storagemanager='
+  - id: storage_manager_databitrate
+    type: int
+    default: 0
+    inputBinding:
+      prefix: 'msout.storagemanager.databitrate='
+      separate: false
+  - id: window_size
+    type: int
+    inputBinding:
+      prefix: 'interpolate.windowsize='
+      separate: false
+
+outputs:
+  - id: msout
+    type: Directory
+    outputBinding:
+      glob: $(inputs.msin.basename)
+label: interpolate_visibilities
+hints:
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor-ci:master
+
+requirements:
+  - class: InitialWorkDirRequirement
+    listing:
+      - entry: $(inputs.msin)
+        writable: true
diff --git a/steps/makesourcedb.cwl b/steps/makesourcedb.cwl
new file mode 100755
index 0000000000000000000000000000000000000000..eb5c2e7c7b8f09c0a2c97ea4512bb241cff17fb5
--- /dev/null
+++ b/steps/makesourcedb.cwl
@@ -0,0 +1,56 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: make_sourcedb
+baseCommand:
+  - makesourcedb
+inputs:
+  - id: sky_model
+    type:
+      - File
+      - string
+    inputBinding:
+      position: 0
+      prefix: in=
+      separate: false
+  - default: Ateam.sourcedb
+    id: output_file_name
+    type: string?
+    inputBinding:
+      position: 1
+      prefix: out=
+      separate: false
+      valueFrom: Ateam.sourcedb
+  - default: blob
+    id: outtype
+    type: string?
+    inputBinding:
+      position: 2
+      prefix: outtype=
+      separate: false
+  - default: <
+    id: format
+    type: string?
+    inputBinding:
+      position: 3
+      prefix: format=
+      separate: false
+outputs:
+  - id: sourcedb
+    type:
+      - Directory
+      - File
+    outputBinding:
+      glob: $(inputs.output_file_name)
+  - id: log
+    type: File?
+    outputBinding:
+      glob: make_sourcedb_ateam.log
+label: make_sourcedb_ateam
+hints:
+  - class: DockerRequirement
+    dockerPull: 'lofareosc/prefactor:latest'
+stdout: make_sourcedb_ateam.log
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/steps/ms_concat.cwl b/steps/ms_concat.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..d9038e8df9506c24c6093b7ed9c4b27fb2a88196
--- /dev/null
+++ b/steps/ms_concat.cwl
@@ -0,0 +1,59 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: ms_concat
+
+
+baseCommand:
+  - concat_MS.py
+inputs:
+  - id: min_length
+    type: int?
+    default: 50
+    inputBinding:
+      position: 0
+      prefix: '--min_length'
+    doc: Minimum amount of subbands to concatenate in frequency.
+  - id: overhead
+    type: float?
+    inputBinding:
+      position: 0
+      prefix: '--overhead'
+    doc: |
+      Only use this fraction of the available memory for deriving the amount
+      of data to be concatenated.
+  - id: msin
+    type: 'Directory[]'
+    inputBinding:
+      position: 1
+      shellQuote: false
+  - default: out.MS
+    id: msout
+    type: string
+    inputBinding:
+      position: 2
+outputs:
+  - id: concat_meta_ms
+    type: Directory[]
+    outputBinding:
+      glob: >
+        $(inputs.msout)_[0-9*]
+  - id: concat_additional_ms
+    type: Directory[]
+    outputBinding:
+      glob: $(inputs.msout)_*_CONCAT
+  - id: ms_outs
+    type: Directory[]
+    outputBinding:
+      outputEval: $(inputs.msin)
+label: ms_concat
+requirements:
+  - class: ShellCommandRequirement
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor-ci:master
+  - class: InlineJavascriptRequirement
+  - class: InitialWorkDirRequirement
+    listing:
+      - entry: $(inputs.msin)
+        writable: true
diff --git a/steps/msinfo.cwl b/steps/msinfo.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..0c7e2f5b779360baef059c0fe61f753a428d8707
--- /dev/null
+++ b/steps/msinfo.cwl
@@ -0,0 +1,40 @@
+#!/usr/bin/env cwl-runner
+
+class: CommandLineTool
+cwlVersion: v1.1
+id: msinfo
+
+requirements:
+  - class: InlineJavascriptRequirement
+  - class: InitialWorkDirRequirement
+    listing:
+      - entryname: msinfo.py
+        entry: |
+          import sys
+          print(sys.argv)
+  - class: SchemaDefRequirement
+    types:
+      - $import: RadioDatatypes.yaml
+hints:
+  DockerRequirement:
+    dockerPull: lofareosc/prefactor-ci:master
+
+baseCommand:
+  - python3
+  - msinfo.py
+
+inputs:
+  data:
+    type: RadioDatatypes.yaml#MeasurementSet
+    inputBinding:
+      position: 0
+
+stdout: std.output
+
+outputs:
+  info:
+    type: File
+    outputBinding:
+      glob: std.output
+label: msinfo
+
diff --git a/steps/predict.cwl b/steps/predict.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..eeb14aef083ee2e7ec43056e68fd018c47023e50
--- /dev/null
+++ b/steps/predict.cwl
@@ -0,0 +1,71 @@
+class: CommandLineTool
+cwlVersion: v1.0
+$namespaces:
+  sbg: 'https://www.sevenbridges.com/'
+id: predict
+baseCommand:
+  - DPPP
+inputs:
+  - id: msin
+    type: Directory
+    inputBinding:
+      position: 0
+      prefix: msin=
+      separate: false
+    doc: Input Measurement Set
+  - default: DATA
+    id: msin_datacolumn
+    type: string
+    inputBinding:
+      position: 0
+      prefix: msin.datacolumn=
+      separate: false
+    doc: Input data Column
+  - default: MODEL_DATA
+    id: msout_datacolumn
+    type: string
+    inputBinding:
+      position: 0
+      prefix: msout.datacolumn=
+      separate: false
+  - id: sources_db
+    type: File
+    inputBinding:
+      position: 0
+      prefix: predict.sourcedb=
+      separate: false
+  - default: null
+    id: sources
+    type: 'string[]'
+    inputBinding:
+      position: 0
+      prefix: predict.sources=
+      separate: false
+      itemSeparator: ','
+      valueFrom: '[$(self)]'
+  - default: false
+    id: usebeammodel
+    type: boolean
+    inputBinding:
+      position: 0
+      prefix: predict.usebeammodel=True
+outputs:
+  - id: msout
+    doc: Output Measurement Set
+    type: Directory
+    outputBinding:
+      glob: $(inputs.msin.basename)
+arguments:
+  - 'steps=[predict]'
+  - predict.beammode=array_factor
+  - predict.usechannelfreq=False
+  - msout=.
+requirements:
+  - class: InitialWorkDirRequirement
+    listing:
+      - entry: $(inputs.msin)
+        writable: true
+  - class: InlineJavascriptRequirement
+hints:
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor-ci:master
diff --git a/steps/wsclean.cwl b/steps/wsclean.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..2bb63f2066cf8237103211ced00a92b2c5c33170
--- /dev/null
+++ b/steps/wsclean.cwl
@@ -0,0 +1,42 @@
+class: CommandLineTool
+cwlVersion: v1.0
+id: wsclean
+baseCommand:
+  - wsclean
+inputs:
+  - id: image_size
+    type: int[]
+    default: [1000, 1000]
+    inputBinding:
+      position: 1
+      prefix: -size
+  - id: image_scale
+    type: float
+    default: 0.01
+    inputBinding:
+      position: 1
+      prefix: -scale
+      valueFrom: $(self)deg
+  - id: image_name
+    default: image
+    type: string
+    inputBinding:
+      position: 1
+      prefix: -name
+  - id: msin
+    type: Directory
+    inputBinding:
+      position: 2
+outputs:
+  dirty_image:
+    type: File
+    outputBinding:
+      glob: $(inputs.image_name)-dirty.fits
+  image:
+    type: File
+    outputBinding:
+      glob: $(inputs.image_name)-image.fits
+label: WSClean
+requirements:
+  - class: DockerRequirement
+    dockerPull: lofareosc/prefactor-ci:master
diff --git a/test_data/A-Team_lowres.sourcedb b/test_data/A-Team_lowres.sourcedb
new file mode 100644
index 0000000000000000000000000000000000000000..b4e89906093cc01438b6a7b81f3ea9bfb06ba520
Binary files /dev/null and b/test_data/A-Team_lowres.sourcedb differ
diff --git a/test_data/L570745_uv_first10.MS.tar.xz.REMOVED.git-id b/test_data/L570745_uv_first10.MS.tar.xz.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..2266c40d2de8785cb1e771f88823e6fb2f02be07
--- /dev/null
+++ b/test_data/L570745_uv_first10.MS.tar.xz.REMOVED.git-id
@@ -0,0 +1 @@
+fac322047acad1a9cf1425d64a08d7bc3548f462
\ No newline at end of file
diff --git a/test_data/example.h5.REMOVED.git-id b/test_data/example.h5.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..ee55446f16fed96380113889ea423eb37e2bdbd0
--- /dev/null
+++ b/test_data/example.h5.REMOVED.git-id
@@ -0,0 +1 @@
+554933b577a0dcf1b2aa3fa91c7de5b2477fd724
\ No newline at end of file
diff --git a/test_data/skymodels/3C196-pandey.skymodel b/test_data/skymodels/3C196-pandey.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..47424b9f86b2b6e06d789f5a54d15a787dffca7c
--- /dev/null
+++ b/test_data/skymodels/3C196-pandey.skymodel
@@ -0,0 +1,11 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='150e6', SpectralIndex='[-0.76, -0.00]', MajorAxis, MinorAxis, Orientation) = format
+
+, , 3c196_4c, 08:13:36.0, 48.13.0
+3C196A1, GAUSSIAN, 3c196_4c, 08:13:35.925,  +48.13.00.061,   33.5514, 0.0, 0.0, 0.0, 150e6, [-0.572,  -0.042],   1.476,     1.091,   135.27
+3C196A2, GAUSSIAN, 3c196_4c, 08:13:35.772,  +48.13.02.507,   12.3129, 0.0, 0.0, 0.0, 150e6, [-0.973,  -0.319],   2.738,     1.754,    93.30
+3C196B1, GAUSSIAN, 3c196_4c, 08:13:36.182,  +48.13.04.725,   14.6030, 0.0, 0.0, 0.0, 150e6, [-0.557,  -0.270],   1.034,     0.248,   124.03
+3C196B2, GAUSSIAN, 3c196_4c, 08:13:36.389,  +48.13.02.735,   22.6653, 0.0, 0.0, 0.0, 150e6, [-0.840,  -0.288],   1.456,     2.159,   324.58
+# Pandey: 31July2014 converted for the normal bbs updated on April 17th from pandey_March26_2014.  DO NOT DELETE THIS LINE
+# Tag:fitted version 2: 17-Apr-2014: pandey@astron.nl using L192832_1CH12S
+# Modified to include a patch name on 24.11.2015 by A. Horneffer
+
diff --git a/test_data/skymodels/3c147-SH.skymodel b/test_data/skymodels/3c147-SH.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..d8e7cd7cab357223c68320e5662228f2e331af40
--- /dev/null
+++ b/test_data/skymodels/3c147-SH.skymodel
@@ -0,0 +1,8 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# Scaife and Heald Calibrator model.
+, , 3c147, 05:42:36.1, 49.51.07
+3c147_1, POINT, 3c147, 05:42:36.1, 49.51.07, 66.738, 0.0, 0.0, 0.0, 150.e6, [-0.022, -1.012, 0.549]
+
diff --git a/test_data/skymodels/3c286-SH.skymodel b/test_data/skymodels/3c286-SH.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..817c01a72a7e141579d04a7c87d794abca143091
--- /dev/null
+++ b/test_data/skymodels/3c286-SH.skymodel
@@ -0,0 +1,8 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# Scaife and Heald Calibrator model.
+, , 3c286, 13:31:08.3, 30.30.33
+3c286_1, POINT, 3c286, 13:31:08.3, 30.30.33, 27.477, 0.0, 0.0, 0.0, 150.e6, [-0.158, 0.032, -0.180]
+
diff --git a/test_data/skymodels/3c287-SH.skymodel b/test_data/skymodels/3c287-SH.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..692009b074139d50389774f206b435eed5bb8307
--- /dev/null
+++ b/test_data/skymodels/3c287-SH.skymodel
@@ -0,0 +1,8 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# Scaife and Heald Calibrator model.
+, , 3c287, 13:30:37.7, 25.09.11
+3c287_1, POINT, 3c287, 13:30:37.7, 25.09.11, 16.367, 0.0, 0.0, 0.0, 150.e6, [-0.364]
+
diff --git a/test_data/skymodels/3c295-twocomp.skymodel b/test_data/skymodels/3c295-twocomp.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..957cadd564d9a2e8ea1010d5e2a35c5d8d33cb4b
--- /dev/null
+++ b/test_data/skymodels/3c295-twocomp.skymodel
@@ -0,0 +1,5 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='150.e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+ , , 3c295_2c, 14:11:20.64, +52.12.09.30
+3c295A,  POINT, 3c295_2c, 14:11:20.49, +52.12.10.70, 48.8815, 0.0, 0.0, 0.0, 150.e6, [-0.582, -0.298, 0.583, -0.363]
+3c295B,  POINT, 3c295_2c, 14:11:20.79, +52.12.07.90, 48.8815, 0.0, 0.0, 0.0, 150.e6, [-0.582, -0.298, 0.583, -0.363]
diff --git a/test_data/skymodels/3c380-SH.skymodel b/test_data/skymodels/3c380-SH.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..5a911080bbac0d42bf8a66afc670085a910cdd57
--- /dev/null
+++ b/test_data/skymodels/3c380-SH.skymodel
@@ -0,0 +1,8 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# Scaife and Heald Calibrator model.
+, , 3c380, 18:29:31.8, 48.44.46
+3c380_1, POINT, 3c380, 18:29:31.8, 48.44.46, 77.352, 0.0, 0.0, 0.0, 150.e6, [-0.767]
+
diff --git a/test_data/skymodels/3c48-SH.skymodel b/test_data/skymodels/3c48-SH.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..e2c3f50da26c04a646fedde67ce861ead3e68133
--- /dev/null
+++ b/test_data/skymodels/3c48-SH.skymodel
@@ -0,0 +1,7 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# Scaife and Heald Calibrator models.
+,  , 3c48,  01:37:41.3, 33.09.35
+3c48_1,  POINT, 3c48,  01:37:41.3, 33.09.35, 64.768, 0.0, 0.0, 0.0, 150.e6, [-0.387, -0.420, 0.181]
diff --git a/test_data/skymodels/A-Team_4_Highres.skymodel.REMOVED.git-id b/test_data/skymodels/A-Team_4_Highres.skymodel.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..3a77caad0a210449d18cd8cf9e7f9ff5094f0bd9
--- /dev/null
+++ b/test_data/skymodels/A-Team_4_Highres.skymodel.REMOVED.git-id
@@ -0,0 +1 @@
+92830adec7ead19c19340071ea59a3131bd82212
\ No newline at end of file
diff --git a/test_data/skymodels/A-Team_lowres.skymodel b/test_data/skymodels/A-Team_lowres.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..cbb1296b7520bbbfede15403b33011cdfbad5e80
--- /dev/null
+++ b/test_data/skymodels/A-Team_lowres.skymodel
@@ -0,0 +1,78 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# models for the A-Team members
+
+, , CygA, 19:59:26, +40.44.00
+CygA_4_2, POINT,    CygA, 19:59:30.433, +40.43.56.221, 4.827e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.00637e+02
+CygA_4_1, GAUSSIAN, CygA, 19:59:28.476, +40.44.01.804, 4.165e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.20516e-02, 5.34011e-03, 1.03230e+02
+CygA_4_3, POINT,    CygA, 19:59:22.168, +40.44.28.591, 3.896e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 9.21061e+01
+CygA_4_4, POINT,    CygA, 19:59:24.413, +40.44.18.617, 2.798e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 6.74922e+01
+CygA_4_5, POINT,    CygA, 19:59:25.555, +40.43.52.813, 1.560e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+
+, , CasA, 23:23:28, +58.48.42
+CasA_4_3, GAUSSIAN, CasA,23:23:21.044, +58.49.42.000, 4.193e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.32664e-02, 1.79281e-02, 2.73207e+01
+CasA_4_2, GAUSSIAN, CasA,23:23:33.918, +58.50.13.374, 4.131e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.25963e-02, 1.87784e-02, 1.12516e+02
+CasA_4_8, GAUSSIAN, CasA,23:23:34.032, +58.47.29.883, 2.536e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 2.77739e-02, 1.42664e-02, 6.26062e+01
+CasA_4_5, GAUSSIAN, CasA,23:23:15.292, +58.50.00.221, 2.316e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 3.15448e-02, 9.02869e-03, 4.11857e+01
+CasA_4_1, GAUSSIAN, CasA,23:23:39.632, +58.48.32.671, 2.245e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 2.25927e-02, 1.70874e-02, 8.48056e+01
+CasA_4_7, GAUSSIAN, CasA,23:23:24.110, +58.47.43.607, 2.201e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.64283e-02, 1.49372e-02, 2.12611e+01
+CasA_4_4, GAUSSIAN, CasA,23:23:14.939, +58.48.09.511, 2.099e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 3.09146e-02, 1.42990e-02, 1.61549e+02
+CasA_4_9, GAUSSIAN, CasA,23:23:10.817, +58.48.46.409, 9.790e+02, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 9.62058e-03, 7.79284e-03, 1.77482e+02
+CasA_4_6, GAUSSIAN, CasA,23:23:26.327, +58.51.14.147, 2.444e+02, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 8.75852e-03, 6.94444e-03, 8.12790e+01
+
+, , TauA, 05:34:32, +21.59.55
+TauA_4_1, GAUSSIAN,  TauA, 05:34:32.269, +21.59.47.597, 1.911e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.94949e-02, 1.31559e-02, 1.65623e+02
+TauA_4_11, GAUSSIAN, TauA, 05:34:28.639, +22.00.53.809, 1.344e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.82500e-02, 1.22959e-02, 2.49193e+01
+TauA_4_3, GAUSSIAN,  TauA, 05:34:25.671, +22.01.26.361, 1.247e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.76133e-02, 1.13962e-02, 5.60626e+01
+TauA_4_9, GAUSSIAN,  TauA, 05:34:23.420, +22.00.12.563, 1.096e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.82128e-02, 1.71142e-02, 3.38306e+01
+TauA_4_15, GAUSSIAN, TauA, 05:34:22.884, +22.01.56.603, 9.243e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.99931e-02, 1.65627e-02, 1.76338e+02
+TauA_4_20, GAUSSIAN, TauA,  05:34:29.086, +21.59.21.722, 8.792e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.23261e-02, 9.03648e-03, 1.09196e+02
+TauA_4_10, GAUSSIAN, TauA,  05:34:37.530, +21.59.06.719, 8.641e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.13390e-02, 1.33726e-02, 1.27644e+02
+TauA_4_2, POINT,     TauA, 05:34:30.550, +21.59.58.106, 8.276e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+TauA_4_5, GAUSSIAN,  TauA,  05:34:40.748, +21.59.31.921, 7.008e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.59971e-02, 1.25206e-02, 1.51745e+02
+TauA_4_14, GAUSSIAN, TauA,  05:34:30.570, +21.58.33.304, 6.187e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.87859e-02, 1.14519e-02, 8.42720e+01
+TauA_4_7, GAUSSIAN,  TauA,  05:34:36.888, +22.01.01.174, 5.537e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.93364e-02, 1.21462e-02, 1.39794e+02
+TauA_4_8, GAUSSIAN,  TauA,  05:34:35.324, +22.00.10.883, 5.525e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.81832e-02, 1.35652e-02, 1.06533e+02
+TauA_4_4, GAUSSIAN,  TauA,  05:34:23.931, +21.58.55.252, 5.076e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.77800e-02, 1.52796e-02, 7.50003e+01
+TauA_4_13, GAUSSIAN, TauA,  05:34:36.235, +21.58.03.089, 4.862e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.59649e-02, 9.18833e-03, 8.58303e+01
+TauA_4_6, GAUSSIAN,  TauA,  05:34:27.470, +21.58.50.002, 4.223e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.54141e-02, 7.87103e-03, 5.52923e+01
+TauA_4_21, GAUSSIAN, TauA,  05:34:34.585, +22.00.45.580, 4.175e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.19587e-02, 6.70123e-03, 1.72839e+02
+TauA_4_19, GAUSSIAN, TauA,  05:34:19.534, +22.01.07.470, 3.906e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.20399e-02, 1.14898e-02, 1.76500e+02
+TauA_4_17, GAUSSIAN, TauA,  05:34:29.426, +21.59.51.003, 2.848e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.10631e-02, 5.13228e-03, 1.27622e+02
+TauA_4_23, GAUSSIAN, TauA,  05:34:26.246, +22.02.05.085, 2.699e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.28687e-02, 1.05568e-02, 1.44302e+02
+TauA_4_16, GAUSSIAN, TauA,  05:34:32.269, +22.01.21.318, 2.557e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.16784e-02, 7.66067e-03, 1.43877e+02
+TauA_4_12, GAUSSIAN, TauA,  05:34:22.991, +22.00.33.000, 2.127e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.49607e-02, 8.16407e-03, 1.16642e+02
+TauA_4_18, GAUSSIAN, TauA,  05:34:26.292, +22.02.39.501, 1.727e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.19757e-02, 6.32082e-03, 1.08185e+02
+TauA_4_22, GAUSSIAN, TauA,  05:34:37.023, +21.58.27.987, 1.357e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.54110e-03, 5.01393e-03, 7.39302e+01
+TauA_4_24, GAUSSIAN, TauA,  05:34:31.108, +22.00.32.726, 1.106e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.59017e-02, 6.94444e-03, 5.84987e+01
+TauA_4_26, GAUSSIAN, TauA,  05:32:23.875, +21.50.58.488, 1.780e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.05524e-02, 3.94647e-03, 6.84955e+01
+TauA_4_25, POINT,    TauA, 05:34:30.647, +21.59.16.928, 9.776e-01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 2.05933e+01
+
+, , VirA, 12:30:35, +12.19.45
+VirA_4_17, GAUSSIAN, VirA, 12:30:34.383, +12.20.04.012, 3.219e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.42972e-02, 6.11535e-02, 6.50364e+01
+VirA_4_2, GAUSSIAN,  VirA,  12:30:47.034, +12.23.43.975, 2.591e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.54400e-03, 4.07169e-03, 1.06884e+02
+VirA_4_1, POINT,     VirA, 12:30:48.961, +12.23.33.770, 1.516e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.70815e+02
+VirA_4_19, GAUSSIAN, VirA,  12:30:41.047, +12.17.36.983, 1.094e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 4.63137e-02, 2.79725e-02, 8.64763e+01
+VirA_4_20, GAUSSIAN, VirA,  12:30:49.250, +12.24.02.102, 1.069e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 9.92793e-02, 2.33402e-02, 1.08930e+01
+VirA_4_7, GAUSSIAN,  VirA,  12:31:00.320, +12.26.38.867, 8.851e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.83541e-02, 3.47954e-02, 1.53069e+02
+VirA_4_6, GAUSSIAN,  VirA,  12:30:55.490, +12.23.49.301, 7.499e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 6.64979e-02, 1.79950e-02, 1.72468e+01
+VirA_4_4, GAUSSIAN,  VirA,  12:30:59.933, +12.22.42.187, 7.388e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.52817e-01, 1.69367e-02, 3.28830e+01
+VirA_4_21, GAUSSIAN, VirA, 12:30:42.588, +12.22.06.778, 6.153e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.81610e-02, 1.87921e-02, 2.03833e+01
+VirA_4_9, GAUSSIAN,  VirA,  12:30:50.661, +12.23.49.618, 5.456e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.36474e-02, 8.25082e-03, 8.58262e+01
+VirA_4_3, POINT,     VirA,  12:30:48.239, +12.23.18.068, 5.398e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.11922e+02
+VirA_4_14, GAUSSIAN, VirA,  12:30:39.222, +12.23.13.204, 5.142e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.40448e-02, 1.75673e-02, 1.70476e+02
+VirA_4_5, POINT,     VirA, 12:30:45.851, +12.23.49.562, 4.189e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 8.15603e+01
+VirA_4_8, GAUSSIAN,  VirA, 12:30:52.150, +12.18.29.472, 3.936e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.38379e-02, 2.30198e-02, 1.60497e+02
+VirA_4_15, GAUSSIAN, VirA,  12:31:01.387, +12.24.37.942, 3.313e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.14509e-02, 1.18403e-02, 7.44971e+01
+VirA_4_12, GAUSSIAN, VirA,  12:31:03.637, +12.23.31.633, 2.835e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.23407e-02, 9.02810e-03, 3.03022e+00
+VirA_4_11, GAUSSIAN, VirA,  12:30:59.512, +12.22.44.364, 2.701e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.66163e-02, 1.08450e-02, 1.34667e+02
+VirA_4_13, GAUSSIAN, VirA,  12:31:00.272, +12.23.41.572, 2.676e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.52105e-02, 1.11420e-02, 1.04009e+02
+VirA_4_10, POINT,    VirA, 12:30:48.452, +12.23.32.663, 2.217e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+VirA_4_16, GAUSSIAN, VirA, 12:30:43.137, +12.23.59.978, 1.788e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.68245e-02, 9.05564e-03, 9.84731e+01
+VirA_4_24, GAUSSIAN, VirA,  12:30:36.867, +12.18.49.897, 1.130e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.28602e-02, 1.66793e-02, 1.45577e+02
+VirA_4_18, POINT,    VirA, 12:30:47.114, +12.23.26.692, 8.179e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+VirA_4_23, GAUSSIAN, VirA, 12:30:44.464, +12.19.17.889, 4.819e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.37460e-02, 1.36631e-02, 1.48507e+02
+VirA_4_22, GAUSSIAN, VirA, 12:30:44.127, +12.23.08.175, 4.207e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.85467e-03, 5.44859e-03, 1.33216e+02
+
diff --git a/test_data/skymodels/Ateam_LBA_CC.skymodel.REMOVED.git-id b/test_data/skymodels/Ateam_LBA_CC.skymodel.REMOVED.git-id
new file mode 100644
index 0000000000000000000000000000000000000000..c143443c567168c864095201d920d70a5351f4bc
--- /dev/null
+++ b/test_data/skymodels/Ateam_LBA_CC.skymodel.REMOVED.git-id
@@ -0,0 +1 @@
+ce968f5b4fb7491d2a63c642cc51d01da2bce829
\ No newline at end of file
diff --git a/test_data/skymodels/Calibrators_SH_lowres.skymodel b/test_data/skymodels/Calibrators_SH_lowres.skymodel
new file mode 100644
index 0000000000000000000000000000000000000000..cbb1296b7520bbbfede15403b33011cdfbad5e80
--- /dev/null
+++ b/test_data/skymodels/Calibrators_SH_lowres.skymodel
@@ -0,0 +1,78 @@
+# (Name, Type, Patch, Ra, Dec, I, Q, U, V, ReferenceFrequency='74e6', SpectralIndex='[]', MajorAxis, MinorAxis, Orientation) = format
+
+# The above line defines the field order and is required.
+
+# models for the A-Team members
+
+, , CygA, 19:59:26, +40.44.00
+CygA_4_2, POINT,    CygA, 19:59:30.433, +40.43.56.221, 4.827e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.00637e+02
+CygA_4_1, GAUSSIAN, CygA, 19:59:28.476, +40.44.01.804, 4.165e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.20516e-02, 5.34011e-03, 1.03230e+02
+CygA_4_3, POINT,    CygA, 19:59:22.168, +40.44.28.591, 3.896e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 9.21061e+01
+CygA_4_4, POINT,    CygA, 19:59:24.413, +40.44.18.617, 2.798e+03, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 6.74922e+01
+CygA_4_5, POINT,    CygA, 19:59:25.555, +40.43.52.813, 1.560e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+
+, , CasA, 23:23:28, +58.48.42
+CasA_4_3, GAUSSIAN, CasA,23:23:21.044, +58.49.42.000, 4.193e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.32664e-02, 1.79281e-02, 2.73207e+01
+CasA_4_2, GAUSSIAN, CasA,23:23:33.918, +58.50.13.374, 4.131e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.25963e-02, 1.87784e-02, 1.12516e+02
+CasA_4_8, GAUSSIAN, CasA,23:23:34.032, +58.47.29.883, 2.536e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 2.77739e-02, 1.42664e-02, 6.26062e+01
+CasA_4_5, GAUSSIAN, CasA,23:23:15.292, +58.50.00.221, 2.316e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 3.15448e-02, 9.02869e-03, 4.11857e+01
+CasA_4_1, GAUSSIAN, CasA,23:23:39.632, +58.48.32.671, 2.245e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 2.25927e-02, 1.70874e-02, 8.48056e+01
+CasA_4_7, GAUSSIAN, CasA,23:23:24.110, +58.47.43.607, 2.201e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 4.64283e-02, 1.49372e-02, 2.12611e+01
+CasA_4_4, GAUSSIAN, CasA,23:23:14.939, +58.48.09.511, 2.099e+03, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 3.09146e-02, 1.42990e-02, 1.61549e+02
+CasA_4_9, GAUSSIAN, CasA,23:23:10.817, +58.48.46.409, 9.790e+02, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 9.62058e-03, 7.79284e-03, 1.77482e+02
+CasA_4_6, GAUSSIAN, CasA,23:23:26.327, +58.51.14.147, 2.444e+02, 0.0, 0.0, 0.0, 7.37817e+07, [-0.8], 8.75852e-03, 6.94444e-03, 8.12790e+01
+
+, , TauA, 05:34:32, +21.59.55
+TauA_4_1, GAUSSIAN,  TauA, 05:34:32.269, +21.59.47.597, 1.911e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.94949e-02, 1.31559e-02, 1.65623e+02
+TauA_4_11, GAUSSIAN, TauA, 05:34:28.639, +22.00.53.809, 1.344e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.82500e-02, 1.22959e-02, 2.49193e+01
+TauA_4_3, GAUSSIAN,  TauA, 05:34:25.671, +22.01.26.361, 1.247e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.76133e-02, 1.13962e-02, 5.60626e+01
+TauA_4_9, GAUSSIAN,  TauA, 05:34:23.420, +22.00.12.563, 1.096e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.82128e-02, 1.71142e-02, 3.38306e+01
+TauA_4_15, GAUSSIAN, TauA, 05:34:22.884, +22.01.56.603, 9.243e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.99931e-02, 1.65627e-02, 1.76338e+02
+TauA_4_20, GAUSSIAN, TauA,  05:34:29.086, +21.59.21.722, 8.792e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.23261e-02, 9.03648e-03, 1.09196e+02
+TauA_4_10, GAUSSIAN, TauA,  05:34:37.530, +21.59.06.719, 8.641e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.13390e-02, 1.33726e-02, 1.27644e+02
+TauA_4_2, POINT,     TauA, 05:34:30.550, +21.59.58.106, 8.276e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+TauA_4_5, GAUSSIAN,  TauA,  05:34:40.748, +21.59.31.921, 7.008e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.59971e-02, 1.25206e-02, 1.51745e+02
+TauA_4_14, GAUSSIAN, TauA,  05:34:30.570, +21.58.33.304, 6.187e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.87859e-02, 1.14519e-02, 8.42720e+01
+TauA_4_7, GAUSSIAN,  TauA,  05:34:36.888, +22.01.01.174, 5.537e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.93364e-02, 1.21462e-02, 1.39794e+02
+TauA_4_8, GAUSSIAN,  TauA,  05:34:35.324, +22.00.10.883, 5.525e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.81832e-02, 1.35652e-02, 1.06533e+02
+TauA_4_4, GAUSSIAN,  TauA,  05:34:23.931, +21.58.55.252, 5.076e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.77800e-02, 1.52796e-02, 7.50003e+01
+TauA_4_13, GAUSSIAN, TauA,  05:34:36.235, +21.58.03.089, 4.862e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.59649e-02, 9.18833e-03, 8.58303e+01
+TauA_4_6, GAUSSIAN,  TauA,  05:34:27.470, +21.58.50.002, 4.223e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.54141e-02, 7.87103e-03, 5.52923e+01
+TauA_4_21, GAUSSIAN, TauA,  05:34:34.585, +22.00.45.580, 4.175e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.19587e-02, 6.70123e-03, 1.72839e+02
+TauA_4_19, GAUSSIAN, TauA,  05:34:19.534, +22.01.07.470, 3.906e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.20399e-02, 1.14898e-02, 1.76500e+02
+TauA_4_17, GAUSSIAN, TauA,  05:34:29.426, +21.59.51.003, 2.848e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.10631e-02, 5.13228e-03, 1.27622e+02
+TauA_4_23, GAUSSIAN, TauA,  05:34:26.246, +22.02.05.085, 2.699e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.28687e-02, 1.05568e-02, 1.44302e+02
+TauA_4_16, GAUSSIAN, TauA,  05:34:32.269, +22.01.21.318, 2.557e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.16784e-02, 7.66067e-03, 1.43877e+02
+TauA_4_12, GAUSSIAN, TauA,  05:34:22.991, +22.00.33.000, 2.127e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.49607e-02, 8.16407e-03, 1.16642e+02
+TauA_4_18, GAUSSIAN, TauA,  05:34:26.292, +22.02.39.501, 1.727e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.19757e-02, 6.32082e-03, 1.08185e+02
+TauA_4_22, GAUSSIAN, TauA,  05:34:37.023, +21.58.27.987, 1.357e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.54110e-03, 5.01393e-03, 7.39302e+01
+TauA_4_24, GAUSSIAN, TauA,  05:34:31.108, +22.00.32.726, 1.106e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.59017e-02, 6.94444e-03, 5.84987e+01
+TauA_4_26, GAUSSIAN, TauA,  05:32:23.875, +21.50.58.488, 1.780e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.05524e-02, 3.94647e-03, 6.84955e+01
+TauA_4_25, POINT,    TauA, 05:34:30.647, +21.59.16.928, 9.776e-01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 2.05933e+01
+
+, , VirA, 12:30:35, +12.19.45
+VirA_4_17, GAUSSIAN, VirA, 12:30:34.383, +12.20.04.012, 3.219e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.42972e-02, 6.11535e-02, 6.50364e+01
+VirA_4_2, GAUSSIAN,  VirA,  12:30:47.034, +12.23.43.975, 2.591e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.54400e-03, 4.07169e-03, 1.06884e+02
+VirA_4_1, POINT,     VirA, 12:30:48.961, +12.23.33.770, 1.516e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.70815e+02
+VirA_4_19, GAUSSIAN, VirA,  12:30:41.047, +12.17.36.983, 1.094e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 4.63137e-02, 2.79725e-02, 8.64763e+01
+VirA_4_20, GAUSSIAN, VirA,  12:30:49.250, +12.24.02.102, 1.069e+02, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 9.92793e-02, 2.33402e-02, 1.08930e+01
+VirA_4_7, GAUSSIAN,  VirA,  12:31:00.320, +12.26.38.867, 8.851e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.83541e-02, 3.47954e-02, 1.53069e+02
+VirA_4_6, GAUSSIAN,  VirA,  12:30:55.490, +12.23.49.301, 7.499e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 6.64979e-02, 1.79950e-02, 1.72468e+01
+VirA_4_4, GAUSSIAN,  VirA,  12:30:59.933, +12.22.42.187, 7.388e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.52817e-01, 1.69367e-02, 3.28830e+01
+VirA_4_21, GAUSSIAN, VirA, 12:30:42.588, +12.22.06.778, 6.153e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.81610e-02, 1.87921e-02, 2.03833e+01
+VirA_4_9, GAUSSIAN,  VirA,  12:30:50.661, +12.23.49.618, 5.456e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.36474e-02, 8.25082e-03, 8.58262e+01
+VirA_4_3, POINT,     VirA,  12:30:48.239, +12.23.18.068, 5.398e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 1.11922e+02
+VirA_4_14, GAUSSIAN, VirA,  12:30:39.222, +12.23.13.204, 5.142e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.40448e-02, 1.75673e-02, 1.70476e+02
+VirA_4_5, POINT,     VirA, 12:30:45.851, +12.23.49.562, 4.189e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 8.15603e+01
+VirA_4_8, GAUSSIAN,  VirA, 12:30:52.150, +12.18.29.472, 3.936e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.38379e-02, 2.30198e-02, 1.60497e+02
+VirA_4_15, GAUSSIAN, VirA,  12:31:01.387, +12.24.37.942, 3.313e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.14509e-02, 1.18403e-02, 7.44971e+01
+VirA_4_12, GAUSSIAN, VirA,  12:31:03.637, +12.23.31.633, 2.835e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 3.23407e-02, 9.02810e-03, 3.03022e+00
+VirA_4_11, GAUSSIAN, VirA,  12:30:59.512, +12.22.44.364, 2.701e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.66163e-02, 1.08450e-02, 1.34667e+02
+VirA_4_13, GAUSSIAN, VirA,  12:31:00.272, +12.23.41.572, 2.676e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.52105e-02, 1.11420e-02, 1.04009e+02
+VirA_4_10, POINT,    VirA, 12:30:48.452, +12.23.32.663, 2.217e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+VirA_4_16, GAUSSIAN, VirA, 12:30:43.137, +12.23.59.978, 1.788e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.68245e-02, 9.05564e-03, 9.84731e+01
+VirA_4_24, GAUSSIAN, VirA,  12:30:36.867, +12.18.49.897, 1.130e+01, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 2.28602e-02, 1.66793e-02, 1.45577e+02
+VirA_4_18, POINT,    VirA, 12:30:47.114, +12.23.26.692, 8.179e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 7.63889e-03, 6.94444e-03, 0.00000e+00
+VirA_4_23, GAUSSIAN, VirA, 12:30:44.464, +12.19.17.889, 4.819e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 1.37460e-02, 1.36631e-02, 1.48507e+02
+VirA_4_22, GAUSSIAN, VirA, 12:30:44.127, +12.23.08.175, 4.207e+00, 0.0, 0.0, 0.0, 7.38000e+07, [-0.8], 8.85467e-03, 5.44859e-03, 1.33216e+02
+
diff --git a/test_jobs/NDPPP.json b/test_jobs/NDPPP.json
new file mode 100644
index 0000000000000000000000000000000000000000..d010d681ec66a6e25ae050193c8a40ac871d40d6
--- /dev/null
+++ b/test_jobs/NDPPP.json
@@ -0,0 +1,21 @@
+{
+  "parset": {
+     "class": "File",
+     "path": "ndppp_step.parset"
+  },
+  "msin": {
+     "class": "Directory",
+     "path": "/data/L570745_SB000_uv_first10.MS"
+  },
+  "output_file_names": {
+    "gaincal": {
+       "name": "test.h5"
+    },
+  },
+  "output_directory_names": {
+    "count": {
+       "count_flagfreq": "L570745_SB000_uv_first10_count.flagfreq",
+       "count_flagstat": "L570745_SB000_uv_first10_count.flagstat"
+    }
+  }
+}
diff --git a/test_jobs/aoflagger.json b/test_jobs/aoflagger.json
new file mode 100644
index 0000000000000000000000000000000000000000..138c5022e2e071f4f84a79fdadbdd063b51bfe3f
--- /dev/null
+++ b/test_jobs/aoflagger.json
@@ -0,0 +1,12 @@
+{
+   "msin": [
+   {
+            "class": "Directory",
+            "path": "/data/L570745_SB000_uv_first10.MS"
+   },
+   {
+           "class": "Directory",
+           "path": "/data/L570745_SB001_uv_first10.MS"
+   }
+   ]
+}
diff --git a/test_jobs/aoflagger_step_generator.json b/test_jobs/aoflagger_step_generator.json
new file mode 100644
index 0000000000000000000000000000000000000000..4c6b5085d4492d2a008d0c0cdd0bbd4139c97132
--- /dev/null
+++ b/test_jobs/aoflagger_step_generator.json
@@ -0,0 +1,8 @@
+{
+  "input_parset": [{
+    "step_type": "name",
+    "step_id": "id",
+    "parameters": []
+}],
+  "strategy": {"class":"File", "path":"/dev/null"}
+}
diff --git a/test_jobs/averager_step_generator.json b/test_jobs/averager_step_generator.json
new file mode 100644
index 0000000000000000000000000000000000000000..4bfe8ddc068c92271e8bb29fad6219214d24a199
--- /dev/null
+++ b/test_jobs/averager_step_generator.json
@@ -0,0 +1,7 @@
+{
+  "input_parset": [{
+    "step_type": "name",
+    "step_id": "id",
+    "parameters": []
+}]
+}
diff --git a/test_jobs/averager_step_generator_error.json b/test_jobs/averager_step_generator_error.json
new file mode 100644
index 0000000000000000000000000000000000000000..c0a124a2a47027e9261e360d5557c31a5de16b4e
--- /dev/null
+++ b/test_jobs/averager_step_generator_error.json
@@ -0,0 +1,9 @@
+{
+  "input_parset": [{
+    "step_type": "name",
+    "step_id": "id",
+    "parameters": []
+}],
+  "step_id": "id",
+  "strategy": {"class":"File", "path":"/dev/null"}
+}
diff --git a/test_jobs/blsmooth.json b/test_jobs/blsmooth.json
new file mode 100644
index 0000000000000000000000000000000000000000..5b300249de098dafe2ad49b7b68b8212ce6ba563
--- /dev/null
+++ b/test_jobs/blsmooth.json
@@ -0,0 +1,7 @@
+{
+    "msin": {
+            "class": "Directory",
+            "path": "/data/L570745_SB003_uv_first10.MS"
+        },
+    "do_smooth": true
+}
diff --git a/test_jobs/ddecal.json b/test_jobs/ddecal.json
new file mode 100644
index 0000000000000000000000000000000000000000..13a89c1f35db2da2d1be6966d5f213619360e514
--- /dev/null
+++ b/test_jobs/ddecal.json
@@ -0,0 +1,8 @@
+{
+  "msin": {
+    "class": "Directory",
+    "path": "/data/L570745_SB001_uv_MODEL.MS"
+  },
+  "msin_datacolumn": "DATA", 
+  "usemodelcolumn": true
+}
diff --git a/test_jobs/demo_prefactor.json b/test_jobs/demo_prefactor.json
new file mode 100644
index 0000000000000000000000000000000000000000..ef2e0db960d13f382cdd2272969ce975e4c7d77f
--- /dev/null
+++ b/test_jobs/demo_prefactor.json
@@ -0,0 +1,17 @@
+{
+    "msin": [
+        {
+            "class": "Directory",
+            "path": "/data/L570745_SB003_uv_first10.MS"
+        },
+        {
+            "class": "Directory",
+            "path": "/data/L570745_SB005_uv_first10.MS"
+        },
+        {
+            "class": "Directory",
+            "path": "/data/L570745_SB008_uv_first10.MS"
+        }
+    ]
+}
+
diff --git a/test_jobs/dp3_execute.json b/test_jobs/dp3_execute.json
new file mode 100644
index 0000000000000000000000000000000000000000..f21dff5b5c3fc6f6c7bd58edc1d6aee45ce5446b
--- /dev/null
+++ b/test_jobs/dp3_execute.json
@@ -0,0 +1,19 @@
+{ 
+  "msin": {"class": "Directory", "path":"/data/L570745_SB003_uv_first10.MS"},
+  "steps": [
+        {
+            "step_type": "averager",
+            "step_id": "average",
+            "parameters": {
+                "timestep": 1,
+                "freqstep": 1,
+                "minpoints": 0,
+                "minperc": 0,
+                "timeresolution": 0,
+                "freqresolution": 0
+            },
+            "output_files": {}
+        }
+    ],
+  "msout_name": "TEST" 
+}
diff --git a/test_jobs/file_selector.json b/test_jobs/file_selector.json
new file mode 100644
index 0000000000000000000000000000000000000000..77e4a30217226c2250882fd1ca55810695577c13
--- /dev/null
+++ b/test_jobs/file_selector.json
@@ -0,0 +1,12 @@
+{
+    "inputs": {
+        "average": {
+            "parmdb": {
+                    "class": "File",
+                    "location": "ndppp_step.parset"
+            }
+        }
+    },
+    "step_name": "average",
+    "key_name": "parmdb"
+}
diff --git a/test_jobs/find_skymodel_cal.json b/test_jobs/find_skymodel_cal.json
new file mode 100644
index 0000000000000000000000000000000000000000..1a0067244b08ded29eccd45b1ec5b3394f72b164
--- /dev/null
+++ b/test_jobs/find_skymodel_cal.json
@@ -0,0 +1,10 @@
+{
+    "msin": {
+        "class": "Directory",
+        "path": "/data/L570745_SB000_uv_first10.MS"
+    },
+    "skymodels": {
+        "class": "Directory",
+        "path": "/data/skymodels"
+    }
+}
diff --git a/test_jobs/flag_average.json b/test_jobs/flag_average.json
new file mode 100644
index 0000000000000000000000000000000000000000..36154f55330703582bc2a83c16cf666d27560148
--- /dev/null
+++ b/test_jobs/flag_average.json
@@ -0,0 +1,6 @@
+{
+  "msin": {
+    "class": "Directory",
+    "path": "/data/L570745_SB001_uv_first10.MS"
+  }
+}
diff --git a/test_jobs/h5parm_collector.json b/test_jobs/h5parm_collector.json
new file mode 100644
index 0000000000000000000000000000000000000000..42c60bb8d15f9f8e49673c916c7d19cec07ae35a
--- /dev/null
+++ b/test_jobs/h5parm_collector.json
@@ -0,0 +1,9 @@
+{
+   "h5parmFiles": [
+   {
+            "class": "File",
+            "path": "/data/example.h5",
+            "format": "lofar:#H5Parm"
+   }
+   ]
+}
diff --git a/test_jobs/integration_test_prefactor_calibrator.json b/test_jobs/integration_test_prefactor_calibrator.json
new file mode 100644
index 0000000000000000000000000000000000000000..672f979893679218fb67c1cc97ecb8721962aa7c
--- /dev/null
+++ b/test_jobs/integration_test_prefactor_calibrator.json
@@ -0,0 +1,14 @@
+{
+    "msin" : [
+        {"class": "Directory", "path": "/data/L570745_SB000_uv_first10.MS"},
+        {"class": "Directory", "path": "/data/L570745_SB001_uv_first10.MS"},
+        {"class": "Directory", "path": "/data/L570745_SB002_uv_first10.MS"}        
+    ],
+    "raw_data": false,
+    "demix": false,
+    "skymodels": {
+        "class": "Directory",
+        "path": "/data/skymodels"
+    },
+    "A-Team_sky_model": "/data/skymodels/Ateam_LBA_CC.skymodel"
+} 
diff --git a/test_jobs/interpolate_visibilities.json b/test_jobs/interpolate_visibilities.json
new file mode 100644
index 0000000000000000000000000000000000000000..a9ce3dea491423d5a858e8a500f78b3df24a63d3
--- /dev/null
+++ b/test_jobs/interpolate_visibilities.json
@@ -0,0 +1,4 @@
+{
+  "msin": { "class":"Directory", "path":"/data/L570745_SB000_uv_first10.MS"},
+  "window_size": 5
+}
diff --git a/test_jobs/losoto_abs.json b/test_jobs/losoto_abs.json
new file mode 100644
index 0000000000000000000000000000000000000000..a283362c08eefe03c690a9a3ad3791dbf4ed74bc
--- /dev/null
+++ b/test_jobs/losoto_abs.json
@@ -0,0 +1,8 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+        "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000"
+}
diff --git a/test_jobs/losoto_duplicate.json b/test_jobs/losoto_duplicate.json
new file mode 100644
index 0000000000000000000000000000000000000000..a283362c08eefe03c690a9a3ad3791dbf4ed74bc
--- /dev/null
+++ b/test_jobs/losoto_duplicate.json
@@ -0,0 +1,8 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+        "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000"
+}
diff --git a/test_jobs/losoto_norm.json b/test_jobs/losoto_norm.json
new file mode 100644
index 0000000000000000000000000000000000000000..d6d689949f55ce2c769956e474508c78c7c28f32
--- /dev/null
+++ b/test_jobs/losoto_norm.json
@@ -0,0 +1,9 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+            "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000",
+    "axesToNorm": ["time"]
+}
diff --git a/test_jobs/losoto_plot.json b/test_jobs/losoto_plot.json
new file mode 100644
index 0000000000000000000000000000000000000000..1316e959d7b7af2e331e320f412a16357d69643d
--- /dev/null
+++ b/test_jobs/losoto_plot.json
@@ -0,0 +1,6 @@
+{
+  "input_h5parm": {"class": "File", "path": "/data/example.h5", "format": "lofar:#H5Parm"},
+  "soltab":  ["sol000/phase000"],
+  "axesInPlot": ["time"],
+  "ncpu": 1
+}
diff --git a/test_jobs/losoto_replicateonaxis.json b/test_jobs/losoto_replicateonaxis.json
new file mode 100644
index 0000000000000000000000000000000000000000..0abfc35d9280bdc84605590f00479a9b5d36d7c6
--- /dev/null
+++ b/test_jobs/losoto_replicateonaxis.json
@@ -0,0 +1,10 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+        "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000",
+    "axisReplicate": "time",
+    "updateWeight": true
+}
diff --git a/test_jobs/losoto_reset.json b/test_jobs/losoto_reset.json
new file mode 100644
index 0000000000000000000000000000000000000000..2d773afb6baa7bb4d83c8fe0d85becf472b54f69
--- /dev/null
+++ b/test_jobs/losoto_reset.json
@@ -0,0 +1,8 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+            "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000"
+}
diff --git a/test_jobs/losoto_residual.json b/test_jobs/losoto_residual.json
new file mode 100644
index 0000000000000000000000000000000000000000..4a56f1c6e77dcb29aac66414ba1cb19253597bd6
--- /dev/null
+++ b/test_jobs/losoto_residual.json
@@ -0,0 +1,9 @@
+{
+    "input_h5parm": {
+            "class": "File",
+            "path": "/data/example.h5",
+            "format": "lofar:#H5Parm"
+        },
+    "soltab": "sol000/amplitude000",
+    "soltabsToSub": ["amplitude000"]
+}
diff --git a/test_jobs/ms_concat.json b/test_jobs/ms_concat.json
new file mode 100644
index 0000000000000000000000000000000000000000..935a917a5ee9ed30ebbb7782305899cecf88bd70
--- /dev/null
+++ b/test_jobs/ms_concat.json
@@ -0,0 +1,14 @@
+{
+   "min_length": 1, 
+   "msin": [
+        {
+            "class": "Directory",
+            "path": "../test_data/L570745_SB000_uv_first10.MS"
+        },
+        {
+            "class": "Directory",
+            "path": "../test_data/L570745_SB001_uv_first10.MS"
+        }
+    ]
+}
+
diff --git a/test_jobs/ndppp_step.parset b/test_jobs/ndppp_step.parset
new file mode 100644
index 0000000000000000000000000000000000000000..450d95c45cfad84ae9af23bd3d51de49035a55ea
--- /dev/null
+++ b/test_jobs/ndppp_step.parset
@@ -0,0 +1,7 @@
+count.save=True
+count.path="."
+gaincal.parmdb=test.h5
+gaincal.usemodelcolumn=True
+gaincal.caltype=diagonal
+msin.modelcolumn=DATA
+steps=[count, gaincal]
diff --git a/test_jobs/parset_generator.json b/test_jobs/parset_generator.json
new file mode 100644
index 0000000000000000000000000000000000000000..5b3c748396c5cc9928b04ce0d57ae41842137835
--- /dev/null
+++ b/test_jobs/parset_generator.json
@@ -0,0 +1,7 @@
+{
+  "parameters_input": [{
+    "step_type": "name",
+    "step_id": "id",
+    "parameters": {"timestep": 1}
+}]
+}
diff --git a/test_jobs/parset_generator_file_input.json b/test_jobs/parset_generator_file_input.json
new file mode 100644
index 0000000000000000000000000000000000000000..c29a5a08f0230adfe440117df3bac1a4ca0023fd
--- /dev/null
+++ b/test_jobs/parset_generator_file_input.json
@@ -0,0 +1,22 @@
+{
+  "parameters_input": [{
+            "step_type": "averager",
+            "step_id": "average",
+            "output_files": {
+                "parmdb": "fily"
+            },
+            "output_directories": {
+                "parmdb": "diry"
+            },
+            "parameters": {
+                "timestep": 1,
+                "freqstep": 1,
+                "strategy": {
+                    "class": "File",
+                    "location": "file:///etc/hostname",
+                    "size": 0,
+                    "nameext": ""
+                }
+            }
+}]
+}
diff --git a/test_jobs/predict.json b/test_jobs/predict.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a493f8755d1350243a7d0f04783dbddc2dda7ea
--- /dev/null
+++ b/test_jobs/predict.json
@@ -0,0 +1,10 @@
+{
+   "msin": {
+     "class": "Directory",
+     "path": "/data/L570745_SB001_uv_first10.MS"
+   },
+  "sources_db": {
+     "class": "File",
+     "path": "/data/A-Team_lowres.sourcedb"
+  }
+}
diff --git a/test_jobs/preflagger_step_generator.json b/test_jobs/preflagger_step_generator.json
new file mode 100644
index 0000000000000000000000000000000000000000..4c6b5085d4492d2a008d0c0cdd0bbd4139c97132
--- /dev/null
+++ b/test_jobs/preflagger_step_generator.json
@@ -0,0 +1,8 @@
+{
+  "input_parset": [{
+    "step_type": "name",
+    "step_id": "id",
+    "parameters": []
+}],
+  "strategy": {"class":"File", "path":"/dev/null"}
+}
diff --git a/test_jobs/selector.json b/test_jobs/selector.json
new file mode 100644
index 0000000000000000000000000000000000000000..3025390d76a1ae4ba3d6aab8482129ece27319cb
--- /dev/null
+++ b/test_jobs/selector.json
@@ -0,0 +1,4 @@
+{
+  "select_a": true,
+  "a_arguments": [{"name": "a"}]
+}