diff --git a/.appveyor.yml b/.appveyor.yml
index 2b3345ba6af1c3d20ac4f43ebc28150b71e3b328..794a9d97928b2e703a3197e7a23991c4e59bb885 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -25,7 +25,7 @@ install:
   - set PATH=%MINICONDA%;%MINICONDA%\\Scripts;%PATH%
   - conda config --set always_yes yes --set changeps1 no
   - conda info -a
-  - conda create -q -n test-environment python=%PYTHON_VERSION% numpy scipy
+  - conda create -q -n test-environment python=%PYTHON_VERSION% numpy scipy Cython
   - activate test-environment
   - python -m pip install --upgrade pip
   - pip install wheel twine pytest
diff --git a/.circleci/config.yml b/.circleci/config.yml
index bbc979697f53a8e3c70fc8f8208864743ff3704d..2e17815acec67ea09a9d16a313aea0547e87f0f4 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -18,7 +18,7 @@ jobs:
           no_output_timeout: 30m
           command: |
             sudo pip install --upgrade pip
-            sudo pip install --only-binary=numpy,scipy numpy scipy pytest pytest-cov codecov
+            sudo pip install --only-binary=numpy,scipy numpy scipy Cython pytest pytest-cov codecov
             sudo pip install -e .[tests]
       - save_cache:
           key: deps9-{{ .Branch }}
diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
index fbbb25408733ee810d17ac793057a3ce8560406d..e084c1e7b020bc7a60dbe34dd683dcd7ba3dc311 100644
--- a/.github/workflows/python-package.yml
+++ b/.github/workflows/python-package.yml
@@ -16,7 +16,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        python-version: [3.6, 3.7, 3.8]
+        python-version: [3.6, 3.7, 3.8, 3.9]
 
     steps:
     - uses: actions/checkout@v2
@@ -29,7 +29,7 @@ jobs:
     - name: Install dependencies
       run: |
         python -m pip install --upgrade pip
-        python -m pip install --only-binary=numpy,scipy numpy scipy pytest pytest-cov codecov flake8
+        python -m pip install --only-binary=numpy,scipy numpy scipy Cython pytest pytest-cov codecov flake8
         python -m pip install -e .[tests]
         if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
     - name: Lint with flake8
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
index afc08ae8fb3491aa3f04d41ff6f9d9521b68448a..85a5e34bb88d6eb9c70eeb1510df09fb1f1b50ef 100644
--- a/.github/workflows/python-publish.yml
+++ b/.github/workflows/python-publish.yml
@@ -11,6 +11,8 @@ name: upload
 on:
   release:
     types: [published]
+  push:
+    branches: [ master ]
 
 jobs:
   build-wheels:
@@ -19,7 +21,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
-        python-version: [3.6, 3.7, 3.8]
+        python-version: [3.6, 3.7, 3.8, 3.9]
         
     steps:
     - uses: actions/checkout@v2
@@ -42,7 +44,7 @@ jobs:
     - name: Install dependencies
       run: |
         python -m pip install --upgrade pip
-        python -m pip install --only-binary=numpy,scipy numpy scipy wheel
+        python -m pip install --only-binary=numpy,scipy numpy scipy Cython wheel
     
     - name: Build wheels
       run: python setup.py bdist_wheel
@@ -80,7 +82,7 @@ jobs:
     - name: Install dependencies
       run: |
         python -m pip install --upgrade pip
-        python -m pip install --only-binary=numpy,scipy numpy scipy wheel
+        python -m pip install --only-binary=numpy,scipy numpy scipy Cython wheel
 
     - name: Build source tar file
       run: python setup.py sdist
diff --git a/setup.py b/setup.py
index b198a4b685025fbbe5b4df178f9dc2a27f89a350..135fb283a9b2cb33a1ef27ff7798cd45a4b5c497 100644
--- a/setup.py
+++ b/setup.py
@@ -303,6 +303,7 @@ setup(
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
         "License :: OSI Approved :: Apache Software License",
         "Topic :: Software Development",
         "Topic :: Scientific/Engineering",