diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f1723d7772df9d8b0ad5fe6c0551619aebb38da5
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,108 @@
+# Official language image. Look for the different tagged releases at:
+# https://hub.docker.com/r/library/python/tags/
+image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/python:3.6
+
+# Change pip's cache directory to be inside the project directory since we can
+# only cache local items.
+variables:
+  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+
+# Pip's cache doesn't store the python packages
+# https://pip.pypa.io/en/stable/reference/pip_install/#caching
+#
+# If you want to also cache the installed packages, you have to install
+# them in a virtualenv and cache it as well.
+cache:
+  paths:
+    - .cache/pip
+    - venv/
+
+before_script:
+  - pip install virtualenv
+  - make show-version # Print out python version for debugging
+  - virtualenv venv
+  - source venv/bin/activate
+  - make deps
+
+stages:          # List of stages for jobs, and their order of execution
+  - test
+  - build
+  - deploy
+
+unit-test-job:  
+  stage: test
+  script:
+    - make test
+
+pylint-test-job:
+  stage: test
+  script:
+    - make pylint
+
+pyflakes-test-job:
+  stage: test
+  script:
+    - make pyflakes
+
+build-job:
+  stage: build
+  script:
+    - make buildbot
+    - git clone https://gitlab-ci-token:$SIGNER_TOKEN@$SIGNER_REPO
+    - bash signer/init_keyring.sh
+    - python signer/signer.py --verbose $GPG_KEY "$PWD/dist"
+  artifacts:
+    paths:
+      - dist
+  only:
+    - devel
+    - master
+
+sphinx-metadata-job:
+  stage: build
+  script:
+    - printf "{\n\"codename\":\"$CI_COMMIT_BRANCH\",\n" > metadata.json
+    - printf "\"suite\":$(if [ "$CI_COMMIT_BRANCH" == "master" ]; then echo \"stable\"; else echo \"unstable\"; fi),\n" >> metadata.json
+    - printf "\"bversion\":\"$(make show-version)\",\n" >> metadata.json
+    - printf "\"revision\":\"$CI_COMMIT_SHA\",\n" >> metadata.json
+    - printf "\"bnumber\":\"$CI_PIPELINE_ID\",\n" >> metadata.json
+    - printf "\"bdate\":\"$(date '+%Y-%m-%d %T')\"\n}\n" >> metadata.json
+  artifacts:
+    paths:
+      - metadata.json
+  only:
+    - master
+    - devel
+
+twine-job:
+  stage: deploy
+  script:
+    - printf "[pypi]\nusername = __token__\npassword = $TWINE_TOKEN\n" > .pypirc
+    - mkdir dist2
+    - cp dist/*.whl dist/*.tar.gz dist2/.
+    - twine upload 'dist2/*' --skip-existing --config-file .pypirc
+  only:
+    - master
+
+pages:
+  stage: deploy
+  script:
+    - make docs
+    - curl -L --header "JOB-TOKEN:$CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/devel/download?job=pages" -o devel.zip
+    - curl -L --header "JOB-TOKEN:$CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/master/download?job=pages" -o master.zip
+    - unzip -n '*.zip' || true # Ignore not existing zipfiles
+    - mkdir -p public/"$CI_COMMIT_BRANCH"
+    - mkdir -p public/"$CI_COMMIT_BRANCH"/files
+    - cp -rf doc/_build/html public/"$CI_COMMIT_BRANCH"
+    - cp -rf dist/* public/"$CI_COMMIT_BRANCH"/files/.
+    - cd public/"$CI_COMMIT_BRANCH"/files
+    - echo "<html><body><h1>Directory listing:</h1>" > ./index.html
+    - find -exec echo "<a href='{}'>{}</a><br/>" \; | sort >> ./index.html
+    - echo "</body></html>" >> ./index.html
+  artifacts:
+    name: "$CI_COMMIT_BRANCH"
+    paths:
+      - public
+  only:
+    - master
+    - devel
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 7ffe9c89c13de8e85638e529333bdf6b390486ef..6a37ddcd55067696dd619ab6d98059ab4164ccc0 100644
--- a/Makefile
+++ b/Makefile
@@ -105,7 +105,12 @@ show-version: FORCE
 #-------------------------------------------------------------------------------
 
 
-deps: deps-python
+deps: deps-python deps-python-dev
+
+deps-python-dev: FORCE
+	@echo "\n$(GREEN)*** Installing Python development dependencies ***$(NC)\n"
+	@pip3 install -r requirements-dev.pip
+
 
 deps-python: FORCE
 	@echo "\n${GREEN}*** Installing Python dependencies ***${NC}\n"
diff --git a/requirements-dev.pip b/requirements-dev.pip
new file mode 100644
index 0000000000000000000000000000000000000000..40ac01bc8e600249217704e4d5b5f6bf9334bd32
--- /dev/null
+++ b/requirements-dev.pip
@@ -0,0 +1,11 @@
+ipranges
+typedcols
+setuptools
+wheel
+twine
+docutils<0.18
+nose==1.3.7
+pyflakes==2.1.0
+pylint==2.2.2
+sphinx==1.8.4
+sphinx-rtd-theme==0.4.2