diff --git a/.ci/azure/pipelines.yml b/.ci/azure/pipelines.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f1b3d688078aeb970b7b879c132929e44df89a44
--- /dev/null
+++ b/.ci/azure/pipelines.yml
@@ -0,0 +1,27 @@
+# kate: indent-width 2;
+
+resources:
+  repositories:
+    - repository: templates
+      type: github
+      name: dune-community/dune-xt-ci
+      endpoint: dune-xt-ci
+
+jobs:
+- template: azure-job-template.yml@templates
+  parameters:
+    dockerimage: debian-unstable_gcc_full
+    jobname: 'unstable_gcc'
+    module: 'dune-xt-la'
+
+- template: azure-job-template.yml@templates
+  parameters:
+    dockerimage: debian_gcc_full
+    jobname: 'gcc'
+    module: 'dune-xt-la'
+
+- template: azure-job-template.yml@templates
+  parameters:
+    dockerimage: debian_clang_full
+    jobname: 'clang'
+    module: 'dune-xt-la'
diff --git a/.ci/shared b/.ci/shared
new file mode 160000
index 0000000000000000000000000000000000000000..64bbb1b35792b945fb9ffa87f5de324698ed5cb4
--- /dev/null
+++ b/.ci/shared
@@ -0,0 +1 @@
+Subproject commit 64bbb1b35792b945fb9ffa87f5de324698ed5cb4
diff --git a/.gitmodules b/.gitmodules
index c14484f01c6707711f326763207045bbfced62e0..7aa1af41fc046cc54af46cb59eec18a989ba9d0f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
 [submodule ".vcsetup"]
 	path = .vcsetup
 	url = https://github.com/dune-community/vcsetup.git
+[submodule ".ci/shared"]
+	path = .ci/shared
+	url = https://github.com/dune-community/dune-xt-ci
diff --git a/.travis.after_script.bash b/.travis.after_script.bash
deleted file mode 100755
index 42c3c618e8d1518a46dc9deeb72fccf343c2e43f..0000000000000000000000000000000000000000
--- a/.travis.after_script.bash
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-#
-# ~~~
-# This file is part of the dune-xt-la project:
-#   https://github.com/dune-community/dune-xt-la
-# Copyright 2009-2018 dune-xt-la developers and contributors. All rights reserved.
-# License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
-#      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
-#          with "runtime exception" (http://www.dune-project.org/license.html)
-# Authors:
-#   Felix Schindler (2017)
-#   René Fritze     (2017 - 2018)
-# ~~~
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
-# this file is treated as a jinja2 template
-
-WAIT="${SUPERDIR}/scripts/bash/travis_wait_new.bash 45"
-source ${SUPERDIR}/scripts/bash/retry_command.bash
-
-if [[ $TRAVIS_JOB_NUMBER == *.2 ]] ; then
-    git config --global hooks.clangformat ${CLANG_FORMAT}
-    CHECK_DIR=${SUPERDIR}/${MY_MODULE}
-    PYTHONPATH=${SUPERDIR}/scripts/python/ python3 -c "import travis_report as tp; tp.clang_format_status(\"${CHECK_DIR}\")"
-    ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} configure
-    ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} make doc
-    ${SUPERDIR}/.ci/init_sshkey.bash ${encrypted_862ca47045d1_key} ${encrypted_862ca47045d1_iv} keys/dune-community/dune-community.github.io
-    ${SUPERDIR}/.ci/deploy_docs.sh ${MY_MODULE} "${DUNE_BUILD_DIR}"
-fi
-
-${SUPERDIR}/.ci/init_sshkey.bash ${encrypted_862ca47045d1_key} ${encrypted_862ca47045d1_iv} keys/dune-community/dune-xt-la-testlogs
-# retry this step because of the implicated race condition in cloning and pushing with multiple builder running in parallel
-retry_command ${SUPERDIR}/scripts/bash/travis_upload_test_logs.bash ${DUNE_BUILD_DIR}/${MY_MODULE}/dune/xt/*/test/
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
\ No newline at end of file
diff --git a/.travis.make_env_file.py b/.travis.make_env_file.py
deleted file mode 100644
index a0e49a1e2e0c05a135aaa245191be61ef6da1acd..0000000000000000000000000000000000000000
--- a/.travis.make_env_file.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python3
-#
-# ~~~
-# This file is part of the dune-xt-la project:
-#   https://github.com/dune-community/dune-xt-la
-# Copyright 2009-2018 dune-xt-la developers and contributors. All rights reserved.
-# License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
-#      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
-#          with "runtime exception" (http://www.dune-project.org/license.html)
-# Authors:
-#   René Fritze (2017 - 2019)
-# ~~~
-
-import os
-from os.path import expanduser
-from shlex import quote
-home = expanduser("~")
-
-prefixes = os.environ.get('ENV_PREFIXES', 'TRAVIS DRONE GITLAB CODECOV CI encrypt TOKEN TESTS').split(' ')
-blacklist = ['TRAVIS_COMMIT_MESSAGE']
-env_file = os.environ.get('ENV_FILE', os.path.join(home, 'env'))
-with open(env_file, 'wt') as env:
-    for k, v in os.environ.items():
-        for pref in prefixes:
-            if k.startswith(pref) and k not in blacklist:
-                env.write('{}={}\n'.format(k, quote(v)))
diff --git a/.travis.script.bash b/.travis.script.bash
deleted file mode 100755
index ee39477aa3511a9954ad8f17a2120a546f893956..0000000000000000000000000000000000000000
--- a/.travis.script.bash
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-#
-# ~~~
-# This file is part of the dune-xt-la project:
-#   https://github.com/dune-community/dune-xt-la
-# Copyright 2009-2018 dune-xt-la developers and contributors. All rights reserved.
-# License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
-#      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
-#          with "runtime exception" (http://www.dune-project.org/license.html)
-# Authors:
-#   Felix Schindler (2017)
-#   René Fritze     (2017 - 2018)
-#   Tobias Leibner  (2018)
-# ~~~
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
-# this file is treated as a jinja2 template
-
-set -e
-set -x
-
-WAIT="${SUPERDIR}/scripts/bash/travis_wait_new.bash 45"
-source ${SUPERDIR}/scripts/bash/retry_command.bash
-
-${SRC_DCTRL} ${BLD} --only=${MY_MODULE} configure
-${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD}
-if [ x"${TESTS}" == x ] ; then
-    ${WAIT} ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD} test_binaries
-else
-    ${WAIT} ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD} test_binaries_builder_${TESTS}
-fi
-
-source ${OPTS}
-CTEST="ctest -V --timeout ${DXT_TEST_TIMEOUT:-300} -j ${DXT_TEST_PROCS:-2}"
-
-if [ x"${TESTS}" == x ] ; then
-    ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${CTEST}
-    ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD} headercheck
-else
-    # with binning headercheck is included in building tests
-    ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${CTEST} -L "^builder_${TESTS}$"
-fi
-
-# clang coverage currently disabled for being to mem hungry
-if [[ ${CC} == *"clang"* ]] ; then
-    echo "Coverage reporting disabled with Clang"
-    exit 0
-fi
-
-if [ "${TRAVIS_SECURE_ENV_VARS}" == "false" ] ; then
-    echo "Coverage reporting disabled for forked repo/PR"
-    exit 0
-fi
-
-pushd ${DUNE_BUILD_DIR}/${MY_MODULE}
-COVERAGE_INFO=${PWD}/coverage.info
-lcov --directory . --output-file ${COVERAGE_INFO} --ignore-errors gcov -c
-for d in "dune-common" "dune-pybindxi" "dune-geometry"  "dune-istl"  "dune-grid" "dune-alugrid"  "dune-uggrid"  "dune-localfunctions" ; do
-    lcov --directory . --output-file ${COVERAGE_INFO} -r ${COVERAGE_INFO} "${SUPERDIR}/${d}/*"
-done
-lcov --directory . --output-file ${COVERAGE_INFO} -r ${COVERAGE_INFO} "${SUPERDIR}/${MY_MODULE}/dune/xt/*/test/*"
-cd ${SUPERDIR}/${MY_MODULE}
-${OLDPWD}/run-in-dune-env pip install codecov
-${OLDPWD}/run-in-dune-env codecov -v -X gcov -X coveragepy -F ctest -f ${COVERAGE_INFO} -t ${CODECOV_TOKEN}
-popd
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
\ No newline at end of file
diff --git a/.travis.test_python.bash b/.travis.test_python.bash
deleted file mode 100755
index b17eb8540bdf306a44e8815acde6ebc89fb6f5a7..0000000000000000000000000000000000000000
--- a/.travis.test_python.bash
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/bash
-#
-# ~~~
-# This file is part of the dune-xt-la project:
-#   https://github.com/dune-community/dune-xt-la
-# Copyright 2009-2018 dune-xt-la developers and contributors. All rights reserved.
-# License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
-#      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
-#          with "runtime exception" (http://www.dune-project.org/license.html)
-# Authors:
-#   René Fritze    (2018)
-#   Tobias Leibner (2018)
-# ~~~
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
-# this file is treated as a jinja2 template
-
-set -e
-set -x
-
-WAIT="${SUPERDIR}/scripts/bash/travis_wait_new.bash 45"
-source ${SUPERDIR}/scripts/bash/retry_command.bash
-
-${SRC_DCTRL} ${BLD} --only=${MY_MODULE} configure
-${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD}
-${WAIT} ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD} bindings
-${WAIT} ${SRC_DCTRL} ${BLD} --only=${MY_MODULE} bexec ${BUILD_CMD} test_python
-
-if [ "${TRAVIS_SECURE_ENV_VARS}" == "false" ] ; then
-    echo "Coverage reporting disabled for forked repo/PR"
-    exit 0
-fi
-
-cd ${SUPERDIR}/${MY_MODULE}
-${DUNE_BUILD_DIR}/${MY_MODULE}/run-in-dune-env pip install codecov
-${DUNE_BUILD_DIR}/${MY_MODULE}/run-in-dune-env codecov -X gcov -F pytest -t ${CODECOV_TOKEN}
-
-# ****** THIS FILE IS AUTOGENERATED, DO NOT EDIT **********
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e6e1875290f635b56cbb4972a5e9967d665debf9..0000000000000000000000000000000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-# ~~~
-# This file is part of the dune-xt-la project:
-#   https://github.com/dune-community/dune-xt-la
-# Copyright 2009-2018 dune-xt-la developers and contributors. All rights reserved.
-# License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
-#      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
-#          with "runtime exception" (http://www.dune-project.org/license.html)
-# Authors:
-#   Felix Schindler (2016 - 2017)
-#   René Fritze     (2016 - 2018)
-#   Tobias Leibner  (2016)
-# ~~~
-
-#   THIS FILE IS AUTOGENERATED -- DO NOT EDIT  #
-#  Re-run .ci/templates/update.py --nd instead #
-
-sudo: true
-dist: trusty
-language: generic
-services: docker
-
-before_script:
-    - export MY_MODULE=dune-xt-la
-    - export BASEIMAGE="${MY_MODULE}-testing_${DOCKER_TAG}:${TRAVIS_BRANCH/\//_}"
-    - export IMAGE="dunecommunity/ci_${MY_MODULE}-testing_${DOCKER_TAG}:${TRAVIS_COMMIT}"
-    # get image with fallback to master branch of the super repo
-    - docker pull dunecommunity/${BASEIMAGE} || export BASEIMAGE="${MY_MODULE}-testing_${DOCKER_TAG}:master" ; docker pull dunecommunity/${BASEIMAGE}
-    - docker build --build-arg BASE=${BASEIMAGE} -t ${IMAGE} -f .ci/docker/Dockerfile .
-
-    - export ENV_FILE=${HOME}/env
-    - python3 ./.travis.make_env_file.py
-    - docker inspect ${IMAGE}
-    - export DOCKER_RUN="docker run --env-file ${ENV_FILE} ${IMAGE}"
-
-script:
-    - ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.script.bash
-
-# runs independent of 'script' failure/success
-after_script:
-    - ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.after_script.bash
-    # output for simpler replicability
-    - docker images ${IMAGE}
-    - echo ${DOCKER_RUN}
-
-after_failure:
-    - echo $DOCKER_PW | docker login --username="$DOCKER_USER" --password-stdin
-    - docker push ${IMAGE}
-    - echo "execute\n ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.script.bash\n to examine errors"
-
-notifications:
-  email:
-    on_success: change
-    on_failure: change
-
-branches:
-  except:
-    - gh-pages
-
-stages:
-    - Test C++
-    - Test Python Bindings
-
-jobs:
-  include:
-  - stage: test_cpp
-    env: DOCKER_TAG=debian-unstable_gcc_full TESTS=0
-  - stage: test_cpp
-    env: DOCKER_TAG=debian-unstable_gcc_full TESTS=1
-    
-  - stage: test_cpp
-    env: DOCKER_TAG=debian_gcc_full TESTS=0
-  - stage: test_cpp
-    env: DOCKER_TAG=debian_gcc_full TESTS=1
-    
-  - stage: test_cpp
-    env: DOCKER_TAG=debian_clang_full TESTS=0
-  - stage: test_cpp
-    env: DOCKER_TAG=debian_clang_full TESTS=1
-    
-  - stage: test_python
-    env: DOCKER_TAG=debian-unstable_gcc_full
-    script: ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.test_python.bash
-    # overwrite other global/matrix settings
-    after_script: true
-  - stage: test_python
-    env: DOCKER_TAG=debian_gcc_full
-    script: ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.test_python.bash
-    # overwrite other global/matrix settings
-    after_script: true
-  - stage: test_python
-    env: DOCKER_TAG=debian_clang_full
-    script: ${DOCKER_RUN} /home/dune-ci/src/dune-xt-la/.travis.test_python.bash
-    # overwrite other global/matrix settings
-    after_script: true
-
-#   THIS FILE IS AUTOGENERATED -- DO NOT EDIT  #
-#  Re-run .ci/templates/update.py --nd instead #
\ No newline at end of file