diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 7db143a8d465f93dd0da35ad150ed827165e6a01..0000000000000000000000000000000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,170 +0,0 @@
-######## Testing minimal compiler requirements ########
-# GCC          8.1.0
-# Clang        8.0
-# Apple Clang  1100.0.33.16
-#######################################################
-
-# Ignore bors testing branches.
-if: NOT branch =~ \.tmp$
-
-language: cpp
-sudo: false
-
-matrix:
-  include:
-########################## OS X #########################
-## test gcc8 - single node/rank with threading backend ##
-  - name: "osx, gcc, serial, py"
-    os: osx
-    osx_image: xcode12
-    python: 3.6
-    env:
-      - MATRIX_EVAL="brew install gcc@8 && brew link --force --overwrite gcc@8 && brew install cmake && CC=gcc-8 && CXX=g++-8"
-      - BUILD_NAME=cthread-osx-gcc-py
-      - WITH_DISTRIBUTED=serial WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: gcc-8
-
-## test gcc8 - mpi with threading backend ##
-  - name: "osx, gcc, mpi, py"
-    os: osx
-    osx_image: xcode12
-    python: 3.6
-    env:
-      - MATRIX_EVAL="brew install gcc@8 && brew link --force --overwrite gcc@8 && brew install cmake && CC=gcc-8 && CXX=g++-8"
-      - BUILD_NAME=mpi-osx-gcc-py
-      - WITH_DISTRIBUTED=mpi WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: gcc-8
-
-## test clang9 - single node/rank with threading backend ##
-  - name: "osx, apple clang, serial, py"
-    os: osx
-    osx_image: xcode12
-    python: 3.6
-    env:
-      - MATRIX_EVAL="CC=clang && CXX=clang++"
-      - BUILD_NAME=cthread-osx-clang-py
-      - WITH_DISTRIBUTED=serial WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: clang
-
-## test clang9 - mpi with threading backend ##
-  - name: "osx, apple clang, mpi, py"
-    os: osx
-    osx_image: xcode12
-    python: 3.6
-    env:
-      - MATRIX_EVAL="CC=clang && CXX=clang++"
-      - BUILD_NAME=mpi-osx-clang
-      - WITH_DISTRIBUTED=mpi WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: clang
-
-######################### LINUX #########################
-## test gcc8 - single node/rank with threading backend ##
-  - name: "linux, gcc, serial, py"
-    os: linux
-    dist: bionic
-    addons:
-      apt:
-        sources:
-        packages:
-          - g++-8
-          - openmpi-bin
-          - libopenmpi-dev
-          - libxml2
-    env:
-      - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8"
-      - BUILD_NAME=cthread-linux-gcc-py
-      - WITH_DISTRIBUTED=serial WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=haswell
-    compiler: gcc-8
-
-## test gcc8 - mpi with threading backend ##
-  - name: "linux, gcc, mpi, py"
-    os: linux
-    dist: bionic
-    addons:
-      apt:
-        sources:
-        packages:
-          - g++-8
-          - openmpi-bin
-          - libopenmpi-dev
-          - libxml2
-    env:
-      - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8"
-      - BUILD_NAME=mpi-linux-gcc-py
-      - WITH_DISTRIBUTED=mpi WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=haswell
-    compiler: gcc-8
-
-## test clang8 - single node/rank with threading backend ##
-# Note: need g++8 for C++17 stdlib.
-  - name: "linux, clang, serial, py"
-    os: linux
-    dist: bionic
-    addons:
-      apt:
-        sources:
-        packages:
-          - g++-8
-          - clang-8
-          - openmpi-bin
-          - libopenmpi-dev
-          - libxml2
-    env:
-      - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8"
-      - BUILD_NAME=cthread-linux-clang-py
-      - WITH_DISTRIBUTED=serial WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: clang-8.0
-
-## test clang8 - mpi with threading backend ##
-# Note: need g++8 for C++17 stdlib.
-  - name: "linux, clang, mpi, py"
-    os: linux
-    dist: bionic
-    addons:
-      apt:
-        sources:
-        packages:
-          - g++-8
-          - clang-8
-          - openmpi-bin
-          - libopenmpi-dev
-          - libxml2
-    env:
-      - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8"
-      - BUILD_NAME=mpi-linux-clang-py
-      - WITH_DISTRIBUTED=mpi WITH_PYTHON=true PY=3 WITH_NEUROML=ON ARCH=native
-    compiler: clang-8.0
-
-before_install:
-  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export HOMEBREW_NO_AUTO_UPDATE=1; brew cask uninstall --force oclint; fi
-
-install:
-  - |
-    if [[ "$WITH_PYTHON" == "true" ]]; then
-      curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-      python$PY get-pip.py
-      pip$PY --version
-      pip$PY install pandas
-      pip$PY install seaborn
-    fi
-  - if [[ ( "$WITH_PYTHON" == "true" ) && ( "$TRAVIS_OS_NAME" == "osx" ) ]]; then pip$PY install numpy; fi
-  - |
-    if [[ "$WITH_DISTRIBUTED" == "mpi" ]]; then
-      if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
-        brew install open-mpi;
-        if [[ "$WITH_PYTHON" == "true" ]]; then
-          pip$PY install mpi4py
-        fi
-      elif [[ ( "$TRAVIS_OS_NAME" == "linux" ) && ( "$WITH_PYTHON" == "true" ) ]]; then
-        pip$PY install mpi4py
-      fi
-    fi
-
-before_script:
-  - eval "${MATRIX_EVAL}"
-
-script: source ./scripts/travis/build.sh
-
-notifications:
-  email:
-    on_success: never
-    on_failure: always
diff --git a/README.md b/README.md
index 448660def79e387ace900c9b0934f440810d63fd..e357256d13ad13b58dcb6d02257c61828b0e6203 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
-[![CI status](https://gitlab.com/cscs-ci/arbor-sim/arbor/badges/master/pipeline.svg)](https://gitlab.com/cscs-ci/arbor-sim/arbor/-/commits/master) [![Build Status](https://travis-ci.org/arbor-sim/arbor.svg?branch=master)](https://travis-ci.org/arbor-sim/arbor) [![codecov](https://codecov.io/gl/cscs-ci:arbor-sim/arbor/branch/master/graph/badge.svg)](https://codecov.io/gl/cscs-ci:arbor-sim/arbor) [![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/arbor-sim/arbor) 
+[![hpc ci](https://gitlab.com/cscs-ci/arbor-sim/arbor/badges/master/pipeline.svg)](https://gitlab.com/cscs-ci/arbor-sim/arbor/-/commits/master)
+[![basic ci](https://github.com/arbor-sim/arbor/workflows/Basic%20Tests%20and%20Documentation/badge.svg)](https://github.com/arbor-sim/arbor/actions?query=workflow%3A%22Basic+Tests+and+Documentation%22)
+[![codecov](https://codecov.io/gl/cscs-ci:arbor-sim/arbor/branch/master/graph/badge.svg)](https://codecov.io/gl/cscs-ci:arbor-sim/arbor)
+[![gitpod](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/arbor-sim/arbor)
+[![docs](https://readthedocs.org/projects/arbor/badge/?version=latest)](https://arbor.readthedocs.io/en/latest/)
 
 # Arbor Library
 
diff --git a/doc/contrib/pr.rst b/doc/contrib/pr.rst
index 5eb2dae5263d32bf1a2523301eef2c3ea8d705bd..01d1d11e264c222bdb466bdb4b76a8ad723ebb85 100644
--- a/doc/contrib/pr.rst
+++ b/doc/contrib/pr.rst
@@ -32,12 +32,13 @@ the workflow is as follows:
    as the Arbor project.
    If this is a problem for you, please contact us at
    `arbor-sim@fz-juelich.de <mailto:arbor-sim@fz-juelich.de>`__.
-5. A PR on Github is automatically built and tested by our CI bot called Travis.
-   You can also run these tests yourself by building them first
+5. A PR on Github is automatically built and tested by GitHub Actions CI pipelines.
+   You can run these tests yourself by building them first
    (``make tests``) and then running them (``./bin/*unit*``).
 
    -  If you make changes effecting simulations on GPUs, you can post a reply to
-      your PR with ``bors try``. This will run our GPU test-suite.
+      your PR with ``bors try``, which will run the test-suite with GPU and MPI
+      enabled on `Piz Daint <https://www.cscs.ch/computers/piz-daint/>`_.
 6. A member of the Arbor development team will review your contribution.
    If they approve, your PR will be merged! Normally this should happen
    within a few days.
@@ -55,7 +56,7 @@ Each pull request is reviewed according to these guidelines:
 
 -  At least one core Arbor team member needs to mark your PR with a
    positive review.
--  Travis CI must produce a favourable result on your PR.
+-  GitHub Actions CI must produce a favourable result on your PR.
 -  An Arbor team member will (squash) merge the PR with the PR change
    summery as commit message.
 -  Consider using Gitpod to review larger PRs, see under checks on the Github PR page.
diff --git a/doc/index.rst b/doc/index.rst
index 0424bb7b259f6b34db56e1313e81fabd9e0d03c7..bb28039bb6121869cee6efdf8449998dbff7aaa1 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -1,8 +1,8 @@
 Arbor
 =====
 
-.. image:: https://travis-ci.org/arbor-sim/arbor.svg?branch=master
-    :target: https://travis-ci.org/arbor-sim/arbor
+.. image:: https://github.com/arbor-sim/arbor/workflows/Basic%20Tests%20and%20Documentation/badge.svg
+    :target: https://github.com/arbor-sim/arbor/actions?query=workflow%3A%22Basic+Tests+and+Documentation%22
 
 Welcome to the documentation for Arbor, the multi-compartment neural network simulation library.
 
diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh
deleted file mode 100755
index 60e6e95b385452b524888b2ec3b99b4fc16a45c1..0000000000000000000000000000000000000000
--- a/scripts/travis/build.sh
+++ /dev/null
@@ -1,135 +0,0 @@
-RED='\033[0;31m'
-YELLOW='\033[0;33m'
-CLEAR='\033[0m'
-
-error()    {>&2 echo -e "${RED}ERROR${CLEAR}: $1"; exit 1;}
-progress() { echo; echo -e "${YELLOW}STATUS${CLEAR}: $1"; echo;}
-
-base_path=`pwd`
-build_path=build-${BUILD_NAME}
-
-#
-# print build-specific and useful information
-#
-progress "build environment"
-
-compiler_version=`${CXX} --version | grep -m1 ""`
-cmake_version=`cmake --version | grep version | awk '{print $3}'`
-
-echo "compiler   : ${compiler_version}"
-echo "cmake      : ${cmake_version}"
-echo "build path : ${build_path}"
-echo "base path  : ${base_path}"
-echo "python3    : $(which python3)"
-echo "python3ver : $(python3 --version)"
-
-if [[ "${WITH_DISTRIBUTED}" == "mpi" ]]; then
-    echo "mpi        : on"
-    export OMPI_CC=${CC}
-    export OMPI_CXX=${CXX}
-    CC="mpicc"
-    CXX="mpicxx"
-    launch="mpiexec -n 4"
-    # on mac:
-    # --oversubscribe flag allows more processes on a node than processing elements
-    # --mca btl tcp,self for Open MPI to use the "tcp" and "self" Byte Transfer Layers for transporting MPI messages
-    # "self" to deliver messages to the same rank as the sender
-    # "tcp" sends messages across TCP-based networks (Transmission Control Protocol with Internet Protocol)
-    if [[ "$TRAVIS_OS_NAME" = "osx" ]]; then
-        launch="${launch} --oversubscribe --mca btl tcp,self"
-    fi
-    WITH_MPI="ON"
-else
-    echo "mpi        : off"
-    launch=""
-    WITH_MPI="OFF"
-fi
-
-if [[ "${WITH_PYTHON}" == "true" ]]; then
-    echo "python     : on"
-    ARB_WITH_PYTHON="ON"
-    # The build process creates the arbor module in build_path/python/arbor
-    export PYTHONPATH=$PYTHONPATH:${base_path}/${build_path}/python
-    python_path=$base_path/python
-    echo "python src : ${python_path}"
-    echo "PYTHONPATH : ${PYTHONPATH}"
-
-    if [[ "$TRAVIS_OS_NAME" = "linux" ]]; then
-        pypref=$(python-config --prefix)
-        PY_FLAGS="-DPYTHON_EXECUTABLE=$pypref/bin/python3.6 -DPYTHON_INCLUDE_DIR=$pypref/include/python3.6m -DPYTHON_LIBRARY=$pypref/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so"
-    else
-        PY_FLAGS=""
-    fi
-else
-    echo "python     : off"
-    ARB_WITH_PYTHON="OFF"
-fi
-
-#
-# make build path
-#
-mkdir -p $build_path
-cd $build_path
-
-#
-# run cmake
-#
-progress "Configuring with cmake"
-
-# Fix CMake/Homebrew/XCode mess. See: https://github.com/apple/swift/pull/32436
-if which xcrun >/dev/null; then
-    typeset -x CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}":$(xcrun --sdk macosx --show-sdk-path)/usr
-fi
-
-cmake_flags="-DARB_WITH_ASSERTIONS=ON -DARB_USE_BUNDLED_LIBS=ON -DARB_WITH_NEUROML=${WITH_NEUROML} -DARB_WITH_MPI=${WITH_MPI} -DARB_WITH_PYTHON=${ARB_WITH_PYTHON} -DARB_ARCH=${ARCH} ${CXX_FLAGS} ${PY_FLAGS}"
-echo "cmake flags: ${cmake_flags}"
-cmake .. ${cmake_flags} || error "unable to configure cmake"
-
-export ARB_NUM_THREADS=2
-
-progress "C++ unit tests"
-make unit -j4                || error "building unit tests"
-./bin/unit --gtest_color=no  || error "running unit tests"
-
-progress "C++ modcc unit testss"
-make unit-modcc -j4                || error "building modcc unit tests"
-./bin/unit-modcc --gtest_color=no  || error "running modcc unit tests"
-
-progress "C++ distributed unit tests (local)"
-make unit-local -j4          || error "building local distributed unit tests"
-./bin/unit-local             || error "running local distributed unit tests"
-
-if [[ "${WITH_DISTRIBUTED}" == "mpi" ]]; then
-    progress "C++ distributed unit tests (MPI)"
-    make unit-mpi -j4        || error "building MPI distributed unit tests"
-    ${launch} ./bin/unit-mpi || error "running MPI distributed unit tests"
-fi
-
-if [[ "${WITH_PYTHON}" == "true" ]]; then
-    progress "Building python module"
-    make pyarb -j4                                                                                || error "building pyarb"
-    progress "Python unit tests"
-    python$PY $python_path/test/unit/runner.py -v2                                                || error "running python unit tests (serial)"
-    progress "Python example: network_ring"
-    python$PY $python_path/example/network_ring.py                                                || error "running python network_ring example"
-    progress "Python example: single_cell_model"
-    python$PY $python_path/example/single_cell_model.py                                           || error "running python single_cell_model example"
-    progress "Python example: single_cell_recipe"
-    python$PY $python_path/example/single_cell_recipe.py                                          || error "running python single_cell_recipe example"
-    progress "Python example: single_cell_detailed"
-    python$PY $python_path/example/single_cell_detailed.py $python_path/example/morph.swc         || error "running python single_cell_detailed example"
-    progress "Python example: single_cell_detailed_recipe"
-    python$PY $python_path/example/single_cell_detailed_recipe.py $python_path/example/morph.swc  || error "running python single_cell_detailed_recipe example"
-    progress "Python example: single_cell_swc"
-    python$PY $python_path/example/single_cell_swc.py  $base_path/test/unit/swc/pyramidal.swc     || error "running python single_cell_swc example"
-    if [[ "${WITH_DISTRIBUTED}" = "mpi" ]]; then
-        if [[ "$TRAVIS_OS_NAME" = "osx" ]]; then
-            progress "Python distributed unit tests (MPI)"
-            ${launch} python$PY $python_path/test/unit_distributed/runner.py -v2 || error "running python distributed unit tests (MPI)"
-        else
-            progress "Python distributed unit tests (MPI) -- skipping on Linux due to Travis config issues on Bionic."
-        fi
-    fi
-fi
-
-cd $base_path