diff --git a/doc/conf.py b/doc/conf.py
index a3c365c31e58606247b272fabd3b4de25349c0c9..c5917cd655c47f949d6f145ae17ae25d54be7b25 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -118,6 +118,7 @@ intersphinx_mapping = {
     "https://documen.tician.de/pyopencl/": None,
     "https://documen.tician.de/modepy/": None,
     "https://documen.tician.de/pymbolic/": None,
+    "https://documen.tician.de/arraycontext/": None,
     "https://documen.tician.de/meshmode/": None,
     "https://documen.tician.de/loopy/": None,
     }
diff --git a/doc/misc.rst b/doc/misc.rst
index c33ed03f79058112c0446cf51b0a7adb51a50b96..4c4c2d7aaf18fd9a6f7f914a301cbb470fd2b589 100644
--- a/doc/misc.rst
+++ b/doc/misc.rst
@@ -33,7 +33,7 @@ MacOS support is in the works.
 
 #.  Type the following command::
 
-        hash -r; for i in pymbolic cgen genpy modepy pyvisfile loopy meshmode dagrt leap grudge; do python -m pip install --editable "git+https://gitlab.tiker.net/inducer/$i.git#egg=$i"; done
+        hash -r; for i in pymbolic cgen genpy modepy pyvisfile loopy arraycontext meshmode dagrt leap grudge; do python -m pip install --editable "git+https://github.com/inducer/$i.git#egg=$i"; done
 
 .. note::
 
diff --git a/requirements.txt b/requirements.txt
index ca045bc369d633d5a367f60411951c0f33ad0c25..1988cc760291c5bf0cdb803dbeb1e8b938e0c53c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,6 +9,7 @@ git+https://github.com/inducer/dagrt.git#egg=dagrt
 git+https://github.com/inducer/leap.git#egg=leap
 git+https://github.com/inducer/meshpy.git#egg=meshpy
 git+https://github.com/inducer/modepy.git#egg=modepy
+git+https://github.com/inducer/arraycontext.git#egg=arraycontext
 git+https://github.com/inducer/meshmode.git#egg=meshmode
 git+https://github.com/inducer/pyvisfile.git#egg=pyvisfile
 git+https://github.com/inducer/pymetis.git#egg=pymetis
diff --git a/setup.py b/setup.py
index 1df0f6aca9e297bcfe3c9a6a025069a7353c01e6..8c9f6767b4a0992ef861ec5cf3d82171e13e8090 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,4 @@
-from __future__ import absolute_import
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
+#!/usr/bin/env python3
 
 
 def main():
@@ -8,52 +6,52 @@ def main():
 
     version_dict = {}
     init_filename = "grudge/version.py"
-    exec(
-        compile(open(init_filename, "r").read(), init_filename, "exec"),
-        version_dict)
-
-    setup(name="grudge",
-          version=version_dict["VERSION_TEXT"],
-          description=(
-              "Discretize discontinuous Galerkin operators quickly, "
-              "on heterogeneous hardware"),
-          long_description=open("README.rst", "rt").read(),
-          author="Andreas Kloeckner",
-          author_email="inform@tiker.net",
-          license="MIT",
-          url="https://github.com/inducer/grudge",
-          classifiers=[
-              'Development Status :: 3 - Alpha',
-              'Intended Audience :: Developers',
-              'Intended Audience :: Other Audience',
-              'Intended Audience :: Science/Research',
-              'License :: OSI Approved :: MIT License',
-              'Natural Language :: English',
-              'Programming Language :: Python',
-
-              'Programming Language :: Python :: 3',
-              'Topic :: Scientific/Engineering',
-              'Topic :: Scientific/Engineering :: Information Analysis',
-              'Topic :: Scientific/Engineering :: Mathematics',
-              'Topic :: Scientific/Engineering :: Visualization',
-              'Topic :: Software Development :: Libraries',
-              'Topic :: Utilities',
-              ],
-
-          packages=find_packages(),
-
-          python_requires="~=3.6",
-          install_requires=[
-              "pytest>=2.3",
-              "pytools>=2020.3",
-              "modepy>=2013.3",
-              "meshmode>=2020.2",
-              "pyopencl>=2013.1",
-              "pymbolic>=2013.2",
-              "loopy>=2020.2",
-              "cgen>=2013.1.2",
-              ])
-
-
-if __name__ == '__main__':
+    exec(compile(open(init_filename, "r").read(), init_filename, "exec"),
+            version_dict)
+
+    setup(
+        name="grudge",
+        version=version_dict["VERSION_TEXT"],
+        description=(
+            "Discretize discontinuous Galerkin operators quickly, "
+            "on heterogeneous hardware"
+        ),
+        long_description=open("README.rst", "rt").read(),
+        author="Andreas Kloeckner",
+        author_email="inform@tiker.net",
+        license="MIT",
+        url="https://github.com/inducer/grudge",
+        classifiers=[
+            "Development Status :: 3 - Alpha",
+            "Intended Audience :: Developers",
+            "Intended Audience :: Other Audience",
+            "Intended Audience :: Science/Research",
+            "License :: OSI Approved :: MIT License",
+            "Natural Language :: English",
+            "Programming Language :: Python",
+            "Programming Language :: Python :: 3",
+            "Topic :: Scientific/Engineering",
+            "Topic :: Scientific/Engineering :: Information Analysis",
+            "Topic :: Scientific/Engineering :: Mathematics",
+            "Topic :: Scientific/Engineering :: Visualization",
+            "Topic :: Software Development :: Libraries",
+            "Topic :: Utilities",
+        ],
+        packages=find_packages(),
+        python_requires="~=3.6",
+        install_requires=[
+            "pytest>=2.3",
+            "pytools>=2020.3",
+            "modepy>=2013.3",
+            "arraycontext>=2021.1",
+            "meshmode>=2020.2",
+            "pyopencl>=2013.1",
+            "pymbolic>=2013.2",
+            "loopy>=2020.2",
+            "cgen>=2013.1.2",
+        ],
+    )
+
+
+if __name__ == "__main__":
     main()