diff --git a/Makefile b/Makefile
index 0e3b59aeb9c4078357c4a9e22c0ba9877238e8f5..28c49bf6ca6ff81473d7df80ba27eee8c23c0148 100644
--- a/Makefile
+++ b/Makefile
@@ -46,6 +46,7 @@ upgrade: $(COMMON_CONSTRAINTS_TXT)  ## update the requirements/*.txt files with
 	pip-compile --upgrade -o requirements/test.txt requirements/test.in
 	pip-compile --upgrade -o requirements/tox.txt requirements/tox.in
 	pip-compile --upgrade -o requirements/ci.txt requirements/ci.in
+	pip-compile --upgrade -o requirements/quality.txt requirements/quality.in
 	# Let tox control the Django version version for tests
 	grep -e "^django==" requirements/test.txt > requirements/django.txt
 	sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp
diff --git a/lti_consumer/lti_1p3/extensions/rest_framework/authentication.py b/lti_consumer/lti_1p3/extensions/rest_framework/authentication.py
index 7aea8634d4c89e6ebfc0b8d7a594515d035dcba5..b4e2d756d5b1db034e3f6b208ef3134aa2b1445a 100644
--- a/lti_consumer/lti_1p3/extensions/rest_framework/authentication.py
+++ b/lti_consumer/lti_1p3/extensions/rest_framework/authentication.py
@@ -3,7 +3,7 @@ Django REST Framework extensions for LTI 1.3 & LTI Advantage implementation.
 
 Implements a custom authentication class to be used by LTI Advantage extensions.
 """
-from django.utils.translation import ugettext as _
+from django.utils.translation import gettext as _
 from rest_framework import authentication
 from rest_framework import exceptions
 
diff --git a/lti_consumer/lti_1p3/tests/test_deep_linking.py b/lti_consumer/lti_1p3/tests/test_deep_linking.py
index cf21c1801befaeec5c2483a88ec93432627aae5d..6d43f69d08f36bc37423a0fec7b11e71ef479cf0 100644
--- a/lti_consumer/lti_1p3/tests/test_deep_linking.py
+++ b/lti_consumer/lti_1p3/tests/test_deep_linking.py
@@ -2,10 +2,9 @@
 Unit tests for LTI 1.3 consumer implementation
 """
 from __future__ import absolute_import, unicode_literals
+from unittest.mock import patch
 
 from django.test.testcases import TestCase
-from mock import patch
-
 from lti_consumer.lti_1p3.constants import LTI_DEEP_LINKING_ACCEPTED_TYPES
 from lti_consumer.lti_1p3.deep_linking import LtiDeepLinking
 from lti_consumer.lti_1p3 import exceptions
diff --git a/lti_consumer/models.py b/lti_consumer/models.py
index 17b32bf5640c23fa4200e3e8df162caca89227ea..a659c929e6bd5cfd5b04583126bd7fc316e89f39 100644
--- a/lti_consumer/models.py
+++ b/lti_consumer/models.py
@@ -6,13 +6,13 @@ import json
 from django.db import models
 from django.core.validators import MinValueValidator
 from django.core.exceptions import ValidationError
-from django.utils.translation import ugettext_lazy as _
 
 from jsonfield import JSONField
 from Cryptodome.PublicKey import RSA
 from opaque_keys.edx.django.models import CourseKeyField, UsageKeyField
 from opaque_keys.edx.keys import CourseKey
 from config_models.models import ConfigurationModel
+from django.utils.translation import gettext_lazy as _
 
 # LTI 1.1
 from lti_consumer.lti_1p1.consumer import LtiConsumer1p1
diff --git a/lti_consumer/plugin/views.py b/lti_consumer/plugin/views.py
index 12beb7bc099278b5e23be3caf276a75a9d501854..4cc4bd8777c23c3e204699a69c6ca7223219de2d 100644
--- a/lti_consumer/plugin/views.py
+++ b/lti_consumer/plugin/views.py
@@ -213,6 +213,7 @@ def deep_linking_response_endpoint(request, lti_config_id=None):
                 content_type = content_item.get('type')
 
                 # Retrieve serializer (or raise)
+                # pylint: disable=consider-iterating-dictionary
                 if content_type not in LTI_DL_CONTENT_TYPE_SERIALIZER_MAP.keys():
                     raise LtiDeepLinkingContentTypeNotSupported()
                 serializer_cls = LTI_DL_CONTENT_TYPE_SERIALIZER_MAP[content_type]
diff --git a/lti_consumer/tests/unit/plugin/test_views_lti_deep_linking.py b/lti_consumer/tests/unit/plugin/test_views_lti_deep_linking.py
index 894ef3f0ce684c36d6a3c6659fed0f723e1738e7..58f77660bd02c159a1fb988b8138ed127217089d 100644
--- a/lti_consumer/tests/unit/plugin/test_views_lti_deep_linking.py
+++ b/lti_consumer/tests/unit/plugin/test_views_lti_deep_linking.py
@@ -1,9 +1,9 @@
 """
 Tests for LTI Advantage Assignments and Grades Service views.
 """
-import ddt
-from mock import patch, PropertyMock, Mock
+from unittest.mock import patch, PropertyMock, Mock
 
+import ddt
 from Cryptodome.PublicKey import RSA
 from jwkest.jwk import RSAKey
 from rest_framework.test import APITransactionTestCase
diff --git a/lti_consumer/tests/unit/plugin/test_views_lti_nrps.py b/lti_consumer/tests/unit/plugin/test_views_lti_nrps.py
index a5cb827eb00ea52c20eab2ee70e214807741bf5f..4a9eabaf39282c425014197f69bd42ab85b68d5f 100644
--- a/lti_consumer/tests/unit/plugin/test_views_lti_nrps.py
+++ b/lti_consumer/tests/unit/plugin/test_views_lti_nrps.py
@@ -1,7 +1,7 @@
 """
 Tests for LTI Names and Role Provisioning Service views.
 """
-from mock import Mock, patch, PropertyMock
+from unittest.mock import Mock, patch, PropertyMock
 from Cryptodome.PublicKey import RSA
 from jwkest.jwk import RSAKey
 from rest_framework.test import APITransactionTestCase
diff --git a/requirements/base.txt b/requirements/base.txt
index 7261356cdbea0bb588ebe7d7287872175e5d3542..e4a0b5bd1349fdc97312121c273f024d9d0811da 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -6,13 +6,15 @@
 #
 appdirs==1.4.4
     # via fs
+asgiref==3.4.1
+    # via django
 bleach==4.1.0
     # via -r requirements/base.in
 certifi==2021.10.8
     # via requests
-charset-normalizer==2.0.7
+charset-normalizer==2.0.10
     # via requests
-django==2.2.24
+django==3.2.11
     # via
     #   -c requirements/common_constraints.txt
     #   -r requirements/base.in
@@ -22,7 +24,7 @@ django==2.2.24
     #   djangorestframework
     #   edx-django-utils
     #   jsonfield
-django-config-models==2.2.0
+django-config-models==2.2.2
     # via
     #   -c requirements/constraints.txt
     #   -r requirements/base.in
@@ -30,17 +32,17 @@ django-crum==0.7.9
     # via edx-django-utils
 django-filter==21.1
     # via -r requirements/base.in
-django-waffle==2.2.1
+django-waffle==2.3.0
     # via edx-django-utils
-djangorestframework==3.12.4
+djangorestframework==3.13.1
     # via
     #   -c requirements/constraints.txt
     #   django-config-models
-edx-django-utils==4.4.0
+edx-django-utils==4.4.1
     # via django-config-models
 edx-opaque-keys[django]==2.2.2
     # via -r requirements/base.in
-fs==2.4.13
+fs==2.4.14
     # via xblock
 future==0.18.2
     # via pyjwkest
@@ -50,11 +52,11 @@ jsonfield==3.1.0
     # via -r requirements/base.in
 lazy==1.4
     # via -r requirements/base.in
-lxml==4.6.4
+lxml==4.7.1
     # via
     #   -r requirements/base.in
     #   xblock
-mako==1.1.5
+mako==1.1.6
     # via
     #   -r requirements/base.in
     #   xblock-utils
@@ -66,34 +68,35 @@ newrelic==7.2.4.171
     # via edx-django-utils
 oauthlib==3.1.1
     # via -r requirements/base.in
-packaging==21.2
+packaging==21.3
     # via bleach
-pbr==5.7.0
+pbr==5.8.0
     # via stevedore
-psutil==5.8.0
+psutil==5.9.0
     # via edx-django-utils
-pycryptodomex==3.11.0
+pycryptodomex==3.12.0
     # via
     #   -r requirements/base.in
     #   pyjwkest
 pyjwkest==1.4.2
     # via -r requirements/base.in
-pymongo==3.12.1
+pymongo==4.0.1
     # via edx-opaque-keys
-pyparsing==2.4.7
+pyparsing==3.0.6
     # via packaging
 python-dateutil==2.8.2
     # via xblock
 pytz==2021.3
     # via
     #   django
+    #   djangorestframework
     #   fs
     #   xblock
 pyyaml==6.0
     # via xblock
-requests==2.26.0
+requests==2.27.1
     # via pyjwkest
-simplejson==3.17.5
+simplejson==3.17.6
     # via xblock-utils
 six==1.16.0
     # via
@@ -107,9 +110,9 @@ stevedore==3.5.0
     # via
     #   edx-django-utils
     #   edx-opaque-keys
-urllib3==1.26.7
+urllib3==1.26.8
     # via requests
-web-fragments==1.1.0
+web-fragments==2.0.0
     # via
     #   xblock
     #   xblock-utils
diff --git a/requirements/ci.txt b/requirements/ci.txt
index 4952a63c52697383673217694a62c1c4624355e4..3fa9ff757e94db220b3596eb45c9bbd432654332 100644
--- a/requirements/ci.txt
+++ b/requirements/ci.txt
@@ -8,24 +8,24 @@ appdirs==1.4.4
     # via
     #   -r requirements/test.txt
     #   fs
+asgiref==3.4.1
+    # via
+    #   -r requirements/test.txt
+    #   django
 astroid==2.8.4
     # via
     #   -r requirements/test.txt
     #   pylint
     #   pylint-celery
-backports.entry-points-selectable==1.1.1
-    # via
-    #   -r requirements/tox.txt
-    #   virtualenv
 bleach==4.1.0
     # via
     #   -r requirements/test.txt
     #   readme-renderer
-boto3==1.20.4
+boto3==1.20.37
     # via
     #   -r requirements/test.txt
     #   fs-s3fs
-botocore==1.23.4
+botocore==1.23.37
     # via
     #   -r requirements/test.txt
     #   boto3
@@ -34,11 +34,7 @@ certifi==2021.10.8
     # via
     #   -r requirements/test.txt
     #   requests
-cffi==1.15.0
-    # via
-    #   -r requirements/test.txt
-    #   cryptography
-charset-normalizer==2.0.7
+charset-normalizer==2.0.10
     # via
     #   -r requirements/test.txt
     #   requests
@@ -60,23 +56,19 @@ colorama==0.4.4
     # via
     #   -r requirements/test.txt
     #   twine
-coverage==6.1.2
+coverage==6.2
     # via
     #   -r requirements/test.txt
     #   coveralls
 coveralls==3.3.1
     # via -r requirements/test.txt
-cryptography==35.0.0
-    # via
-    #   -r requirements/test.txt
-    #   secretstorage
 ddt==1.4.4
     # via -r requirements/test.txt
-distlib==0.3.3
+distlib==0.3.4
     # via
     #   -r requirements/tox.txt
     #   virtualenv
-django==2.2.24
+django==3.2.11
     # via
     #   -c requirements/common_constraints.txt
     #   -r requirements/test.txt
@@ -88,7 +80,7 @@ django==2.2.24
     #   edx-django-utils
     #   jsonfield
     #   xblock-sdk
-django-config-models==2.2.0
+django-config-models==2.2.2
     # via
     #   -c requirements/constraints.txt
     #   -r requirements/test.txt
@@ -100,11 +92,11 @@ django-filter==21.1
     # via -r requirements/test.txt
 django-pyfs==3.1.0
     # via -r requirements/test.txt
-django-waffle==2.2.1
+django-waffle==2.3.0
     # via
     #   -r requirements/test.txt
     #   edx-django-utils
-djangorestframework==3.12.4
+djangorestframework==3.13.1
     # via
     #   -c requirements/constraints.txt
     #   -r requirements/test.txt
@@ -113,11 +105,11 @@ docopt==0.6.2
     # via
     #   -r requirements/test.txt
     #   coveralls
-docutils==0.18
+docutils==0.18.1
     # via
     #   -r requirements/test.txt
     #   readme-renderer
-edx-django-utils==4.4.0
+edx-django-utils==4.4.1
     # via
     #   -r requirements/test.txt
     #   django-config-models
@@ -125,12 +117,12 @@ edx-lint==5.2.1
     # via -r requirements/test.txt
 edx-opaque-keys[django]==2.2.2
     # via -r requirements/test.txt
-filelock==3.3.2
+filelock==3.4.2
     # via
     #   -r requirements/tox.txt
     #   tox
     #   virtualenv
-fs==2.4.13
+fs==2.4.14
     # via
     #   -r requirements/test.txt
     #   django-pyfs
@@ -148,7 +140,7 @@ idna==3.3
     # via
     #   -r requirements/test.txt
     #   requests
-importlib-metadata==4.8.2
+importlib-metadata==4.10.1
     # via
     #   -r requirements/test.txt
     #   keyring
@@ -157,11 +149,6 @@ isort==5.10.1
     # via
     #   -r requirements/test.txt
     #   pylint
-jeepney==0.7.1
-    # via
-    #   -r requirements/test.txt
-    #   keyring
-    #   secretstorage
 jinja2==3.0.3
     # via
     #   -r requirements/test.txt
@@ -173,21 +160,21 @@ jmespath==0.10.0
     #   botocore
 jsonfield==3.1.0
     # via -r requirements/test.txt
-keyring==23.2.1
+keyring==23.5.0
     # via
     #   -r requirements/test.txt
     #   twine
 lazy==1.4
     # via -r requirements/test.txt
-lazy-object-proxy==1.6.0
+lazy-object-proxy==1.7.1
     # via
     #   -r requirements/test.txt
     #   astroid
-lxml==4.6.4
+lxml==4.7.1
     # via
     #   -r requirements/test.txt
     #   xblock
-mako==1.1.5
+mako==1.1.6
     # via
     #   -r requirements/test.txt
     #   xblock-utils
@@ -209,21 +196,21 @@ newrelic==7.2.4.171
     #   edx-django-utils
 oauthlib==3.1.1
     # via -r requirements/test.txt
-packaging==21.2
+packaging==21.3
     # via
     #   -r requirements/test.txt
     #   -r requirements/tox.txt
     #   bleach
     #   tox
-pbr==5.7.0
+pbr==5.8.0
     # via
     #   -r requirements/test.txt
     #   stevedore
-pkginfo==1.7.1
+pkginfo==1.8.2
     # via
     #   -r requirements/test.txt
     #   twine
-platformdirs==2.4.0
+platformdirs==2.4.1
     # via
     #   -r requirements/test.txt
     #   -r requirements/tox.txt
@@ -233,7 +220,7 @@ pluggy==1.0.0
     # via
     #   -r requirements/tox.txt
     #   tox
-psutil==5.8.0
+psutil==5.9.0
     # via
     #   -r requirements/test.txt
     #   edx-django-utils
@@ -243,15 +230,11 @@ py==1.11.0
     #   tox
 pycodestyle==2.8.0
     # via -r requirements/test.txt
-pycparser==2.21
-    # via
-    #   -r requirements/test.txt
-    #   cffi
-pycryptodomex==3.11.0
+pycryptodomex==3.12.0
     # via
     #   -r requirements/test.txt
     #   pyjwkest
-pygments==2.10.0
+pygments==2.11.2
     # via
     #   -r requirements/test.txt
     #   readme-renderer
@@ -268,20 +251,20 @@ pylint-celery==0.3
     # via
     #   -r requirements/test.txt
     #   edx-lint
-pylint-django==2.4.4
+pylint-django==2.5.0
     # via
     #   -r requirements/test.txt
     #   edx-lint
-pylint-plugin-utils==0.6
+pylint-plugin-utils==0.7
     # via
     #   -r requirements/test.txt
     #   pylint-celery
     #   pylint-django
-pymongo==3.12.1
+pymongo==4.0.1
     # via
     #   -r requirements/test.txt
     #   edx-opaque-keys
-pyparsing==2.4.7
+pyparsing==3.0.6
     # via
     #   -r requirements/test.txt
     #   -r requirements/tox.txt
@@ -299,6 +282,7 @@ pytz==2021.3
     # via
     #   -r requirements/test.txt
     #   django
+    #   djangorestframework
     #   fs
     #   xblock
 pyyaml==6.0
@@ -306,11 +290,11 @@ pyyaml==6.0
     #   -r requirements/test.txt
     #   code-annotations
     #   xblock
-readme-renderer==30.0
+readme-renderer==32.0
     # via
     #   -r requirements/test.txt
     #   twine
-requests==2.26.0
+requests==2.27.1
     # via
     #   -r requirements/test.txt
     #   coveralls
@@ -321,7 +305,7 @@ requests-toolbelt==0.9.1
     # via
     #   -r requirements/test.txt
     #   twine
-rfc3986==1.5.0
+rfc3986==2.0.0
     # via
     #   -r requirements/test.txt
     #   twine
@@ -329,11 +313,7 @@ s3transfer==0.5.0
     # via
     #   -r requirements/test.txt
     #   boto3
-secretstorage==3.3.1
-    # via
-    #   -r requirements/test.txt
-    #   keyring
-simplejson==3.17.5
+simplejson==3.17.6
     # via
     #   -r requirements/test.txt
     #   xblock-utils
@@ -369,29 +349,29 @@ toml==0.10.2
     #   -r requirements/tox.txt
     #   pylint
     #   tox
-tox==3.24.4
+tox==3.24.5
     # via -r requirements/tox.txt
 tqdm==4.62.3
     # via
     #   -r requirements/test.txt
     #   twine
-twine==3.6.0
+twine==3.7.1
     # via -r requirements/test.txt
-typing-extensions==3.10.0.2
+typing-extensions==4.0.1
     # via
     #   -r requirements/test.txt
     #   astroid
     #   pylint
-urllib3==1.26.7
+urllib3==1.26.8
     # via
     #   -r requirements/test.txt
     #   botocore
     #   requests
-virtualenv==20.10.0
+virtualenv==20.13.0
     # via
     #   -r requirements/tox.txt
     #   tox
-web-fragments==1.1.0
+web-fragments==2.0.0
     # via
     #   -r requirements/test.txt
     #   xblock
@@ -416,7 +396,7 @@ xblock-sdk==0.4.0
     # via -r requirements/test.txt
 xblock-utils==2.2.0
     # via -r requirements/test.txt
-zipp==3.6.0
+zipp==3.7.0
     # via
     #   -r requirements/test.txt
     #   importlib-metadata
diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt
index 881ec4ffd4dc304a78aa519356099c8646ccf069..e8b5d79f920babc1cd6c84dc3b82617ba7d9d5a7 100644
--- a/requirements/common_constraints.txt
+++ b/requirements/common_constraints.txt
@@ -13,7 +13,7 @@
 
 
 # using LTS django version
-Django<2.3
+Django<4.0
 
 # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process.
 # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html
diff --git a/requirements/dev.in b/requirements/dev.in
index da687bd6b5ecdc996b945b1b8f19b284cf51150b..dedb561003126535e1b4152e5ed89f8872301dd7 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -1,3 +1,3 @@
 # Core requirements + translation tools
 -r base.txt
-edx-i18n-tools==0.5.0
\ No newline at end of file
+edx-i18n-tools
diff --git a/requirements/dev.txt b/requirements/dev.txt
index fd8ad2248ef2745fec9c4fe9863fd71c62102f0d..098affa1cee113f6fdfbd7fe44e82f933ab6c18d 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -8,17 +8,21 @@ appdirs==1.4.4
     # via
     #   -r requirements/base.txt
     #   fs
+asgiref==3.4.1
+    # via
+    #   -r requirements/base.txt
+    #   django
 bleach==4.1.0
     # via -r requirements/base.txt
 certifi==2021.10.8
     # via
     #   -r requirements/base.txt
     #   requests
-charset-normalizer==2.0.7
+charset-normalizer==2.0.10
     # via
     #   -r requirements/base.txt
     #   requests
-django==2.2.24
+django==3.2.11
     # via
     #   -r requirements/base.txt
     #   django-config-models
@@ -28,7 +32,7 @@ django==2.2.24
     #   edx-django-utils
     #   edx-i18n-tools
     #   jsonfield
-django-config-models==2.2.0
+django-config-models==2.2.2
     # via -r requirements/base.txt
 django-crum==0.7.9
     # via
@@ -36,23 +40,23 @@ django-crum==0.7.9
     #   edx-django-utils
 django-filter==21.1
     # via -r requirements/base.txt
-django-waffle==2.2.1
+django-waffle==2.3.0
     # via
     #   -r requirements/base.txt
     #   edx-django-utils
-djangorestframework==3.12.4
+djangorestframework==3.13.1
     # via
     #   -r requirements/base.txt
     #   django-config-models
-edx-django-utils==4.4.0
+edx-django-utils==4.4.1
     # via
     #   -r requirements/base.txt
     #   django-config-models
-edx-i18n-tools==0.5.0
+edx-i18n-tools==0.8.1
     # via -r requirements/dev.in
 edx-opaque-keys[django]==2.2.2
     # via -r requirements/base.txt
-fs==2.4.13
+fs==2.4.14
     # via
     #   -r requirements/base.txt
     #   xblock
@@ -68,11 +72,11 @@ jsonfield==3.1.0
     # via -r requirements/base.txt
 lazy==1.4
     # via -r requirements/base.txt
-lxml==4.6.4
+lxml==4.7.1
     # via
     #   -r requirements/base.txt
     #   xblock
-mako==1.1.5
+mako==1.1.6
     # via
     #   -r requirements/base.txt
     #   xblock-utils
@@ -87,35 +91,33 @@ newrelic==7.2.4.171
     #   edx-django-utils
 oauthlib==3.1.1
     # via -r requirements/base.txt
-packaging==21.2
+packaging==21.3
     # via
     #   -r requirements/base.txt
     #   bleach
-path==16.2.0
-    # via path.py
-path.py==12.5.0
+path==16.3.0
     # via edx-i18n-tools
-pbr==5.7.0
+pbr==5.8.0
     # via
     #   -r requirements/base.txt
     #   stevedore
 polib==1.1.1
     # via edx-i18n-tools
-psutil==5.8.0
+psutil==5.9.0
     # via
     #   -r requirements/base.txt
     #   edx-django-utils
-pycryptodomex==3.11.0
+pycryptodomex==3.12.0
     # via
     #   -r requirements/base.txt
     #   pyjwkest
 pyjwkest==1.4.2
     # via -r requirements/base.txt
-pymongo==3.12.1
+pymongo==4.0.1
     # via
     #   -r requirements/base.txt
     #   edx-opaque-keys
-pyparsing==2.4.7
+pyparsing==3.0.6
     # via
     #   -r requirements/base.txt
     #   packaging
@@ -127,6 +129,7 @@ pytz==2021.3
     # via
     #   -r requirements/base.txt
     #   django
+    #   djangorestframework
     #   fs
     #   xblock
 pyyaml==6.0
@@ -134,11 +137,11 @@ pyyaml==6.0
     #   -r requirements/base.txt
     #   edx-i18n-tools
     #   xblock
-requests==2.26.0
+requests==2.27.1
     # via
     #   -r requirements/base.txt
     #   pyjwkest
-simplejson==3.17.5
+simplejson==3.17.6
     # via
     #   -r requirements/base.txt
     #   xblock-utils
@@ -146,7 +149,6 @@ six==1.16.0
     # via
     #   -r requirements/base.txt
     #   bleach
-    #   edx-i18n-tools
     #   fs
     #   pyjwkest
     #   python-dateutil
@@ -159,11 +161,11 @@ stevedore==3.5.0
     #   -r requirements/base.txt
     #   edx-django-utils
     #   edx-opaque-keys
-urllib3==1.26.7
+urllib3==1.26.8
     # via
     #   -r requirements/base.txt
     #   requests
-web-fragments==1.1.0
+web-fragments==2.0.0
     # via
     #   -r requirements/base.txt
     #   xblock
diff --git a/requirements/django.txt b/requirements/django.txt
index f44fd3316c47ae79d8a45dec00495d75e906647b..c93648df5edf815f3aa70874cd8161275022c58e 100644
--- a/requirements/django.txt
+++ b/requirements/django.txt
@@ -1 +1 @@
-django==2.2.24
+django==3.2.11
diff --git a/requirements/pip.txt b/requirements/pip.txt
index ac73ce51679dc25be3b7787cf931a9811fe34585..de37a34a0ed54ca32eebe19fc89f7b6b75ef4162 100644
--- a/requirements/pip.txt
+++ b/requirements/pip.txt
@@ -4,11 +4,11 @@
 #
 #    make upgrade
 #
-wheel==0.37.0
+wheel==0.37.1
     # via -r requirements/pip.in
 
 # The following packages are considered to be unsafe in a requirements file:
 pip==21.3.1
     # via -r requirements/pip.in
-setuptools==58.5.3
+setuptools==60.5.0
     # via -r requirements/pip.in
diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt
index 2aea4ec88811cda8ab3d33399ff5ee2a4e5bc7e1..18c84c8413182a6a4829332f511088334d8554d9 100644
--- a/requirements/pip_tools.txt
+++ b/requirements/pip_tools.txt
@@ -10,9 +10,9 @@ pep517==0.12.0
     # via pip-tools
 pip-tools==6.4.0
     # via -r requirements/pip_tools.in
-tomli==1.2.2
+tomli==2.0.0
     # via pep517
-wheel==0.37.0
+wheel==0.37.1
     # via pip-tools
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/quality.in b/requirements/quality.in
new file mode 100644
index 0000000000000000000000000000000000000000..cfc49e3c45d22b4ac2741e2f6d0143f055361503
--- /dev/null
+++ b/requirements/quality.in
@@ -0,0 +1,10 @@
+# Requirements for Quality runs
+-c constraints.txt
+
+-r base.txt 
+
+pycodestyle
+pylint
+edx_lint
+xblock-sdk
+ddt
diff --git a/requirements/quality.txt b/requirements/quality.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1366ad66d567ccfa2ab7de3a2bf3b8f8caf6a3ea
--- /dev/null
+++ b/requirements/quality.txt
@@ -0,0 +1,248 @@
+#
+# This file is autogenerated by pip-compile with python 3.8
+# To update, run:
+#
+#    pip-compile --output-file=requirements/quality.txt requirements/quality.in
+#
+appdirs==1.4.4
+    # via
+    #   -r requirements/base.txt
+    #   fs
+asgiref==3.4.1
+    # via
+    #   -r requirements/base.txt
+    #   django
+astroid==2.9.3
+    # via
+    #   pylint
+    #   pylint-celery
+bleach==4.1.0
+    # via -r requirements/base.txt
+certifi==2021.10.8
+    # via
+    #   -r requirements/base.txt
+    #   requests
+charset-normalizer==2.0.10
+    # via
+    #   -r requirements/base.txt
+    #   requests
+click==8.0.3
+    # via
+    #   click-log
+    #   code-annotations
+    #   edx-lint
+click-log==0.3.2
+    # via edx-lint
+code-annotations==1.2.0
+    # via edx-lint
+ddt==1.4.4
+    # via -r requirements/quality.in
+django==3.2.11
+    # via
+    #   -c requirements/common_constraints.txt
+    #   -r requirements/base.txt
+    #   django-config-models
+    #   django-crum
+    #   django-filter
+    #   djangorestframework
+    #   edx-django-utils
+    #   jsonfield
+    #   xblock-sdk
+django-config-models==2.2.2
+    # via
+    #   -c requirements/constraints.txt
+    #   -r requirements/base.txt
+django-crum==0.7.9
+    # via
+    #   -r requirements/base.txt
+    #   edx-django-utils
+django-filter==21.1
+    # via -r requirements/base.txt
+django-waffle==2.3.0
+    # via
+    #   -r requirements/base.txt
+    #   edx-django-utils
+djangorestframework==3.13.1
+    # via
+    #   -c requirements/constraints.txt
+    #   -r requirements/base.txt
+    #   django-config-models
+edx-django-utils==4.4.1
+    # via
+    #   -r requirements/base.txt
+    #   django-config-models
+edx-lint==5.2.1
+    # via -r requirements/quality.in
+edx-opaque-keys[django]==2.2.2
+    # via -r requirements/base.txt
+fs==2.4.14
+    # via
+    #   -r requirements/base.txt
+    #   xblock
+future==0.18.2
+    # via
+    #   -r requirements/base.txt
+    #   pyjwkest
+idna==3.3
+    # via
+    #   -r requirements/base.txt
+    #   requests
+isort==5.10.1
+    # via pylint
+jinja2==3.0.3
+    # via code-annotations
+jsonfield==3.1.0
+    # via -r requirements/base.txt
+lazy==1.4
+    # via -r requirements/base.txt
+lazy-object-proxy==1.7.1
+    # via astroid
+lxml==4.7.1
+    # via
+    #   -r requirements/base.txt
+    #   xblock
+mako==1.1.6
+    # via
+    #   -r requirements/base.txt
+    #   xblock-utils
+markupsafe==2.0.1
+    # via
+    #   -r requirements/base.txt
+    #   jinja2
+    #   mako
+    #   xblock
+mccabe==0.6.1
+    # via pylint
+newrelic==7.2.4.171
+    # via
+    #   -r requirements/base.txt
+    #   edx-django-utils
+oauthlib==3.1.1
+    # via -r requirements/base.txt
+packaging==21.3
+    # via
+    #   -r requirements/base.txt
+    #   bleach
+pbr==5.8.0
+    # via
+    #   -r requirements/base.txt
+    #   stevedore
+platformdirs==2.4.1
+    # via pylint
+psutil==5.9.0
+    # via
+    #   -r requirements/base.txt
+    #   edx-django-utils
+pycodestyle==2.8.0
+    # via -r requirements/quality.in
+pycryptodomex==3.12.0
+    # via
+    #   -r requirements/base.txt
+    #   pyjwkest
+pyjwkest==1.4.2
+    # via -r requirements/base.txt
+pylint==2.12.2
+    # via
+    #   -r requirements/quality.in
+    #   edx-lint
+    #   pylint-celery
+    #   pylint-django
+    #   pylint-plugin-utils
+pylint-celery==0.3
+    # via edx-lint
+pylint-django==2.5.0
+    # via edx-lint
+pylint-plugin-utils==0.7
+    # via
+    #   pylint-celery
+    #   pylint-django
+pymongo==4.0.1
+    # via
+    #   -r requirements/base.txt
+    #   edx-opaque-keys
+pyparsing==3.0.6
+    # via
+    #   -r requirements/base.txt
+    #   packaging
+python-dateutil==2.8.2
+    # via
+    #   -r requirements/base.txt
+    #   xblock
+python-slugify==5.0.2
+    # via code-annotations
+pytz==2021.3
+    # via
+    #   -r requirements/base.txt
+    #   django
+    #   djangorestframework
+    #   fs
+    #   xblock
+pyyaml==6.0
+    # via
+    #   -r requirements/base.txt
+    #   code-annotations
+    #   xblock
+requests==2.27.1
+    # via
+    #   -r requirements/base.txt
+    #   pyjwkest
+simplejson==3.17.6
+    # via
+    #   -r requirements/base.txt
+    #   xblock-utils
+six==1.16.0
+    # via
+    #   -r requirements/base.txt
+    #   bleach
+    #   edx-lint
+    #   fs
+    #   pyjwkest
+    #   python-dateutil
+sqlparse==0.4.2
+    # via
+    #   -r requirements/base.txt
+    #   django
+stevedore==3.5.0
+    # via
+    #   -r requirements/base.txt
+    #   code-annotations
+    #   edx-django-utils
+    #   edx-opaque-keys
+text-unidecode==1.3
+    # via python-slugify
+toml==0.10.2
+    # via pylint
+typing-extensions==4.0.1
+    # via
+    #   astroid
+    #   pylint
+urllib3==1.26.8
+    # via
+    #   -r requirements/base.txt
+    #   requests
+web-fragments==2.0.0
+    # via
+    #   -r requirements/base.txt
+    #   xblock
+    #   xblock-utils
+webencodings==0.5.1
+    # via
+    #   -r requirements/base.txt
+    #   bleach
+webob==1.8.7
+    # via
+    #   -r requirements/base.txt
+    #   xblock
+wrapt==1.13.3
+    # via astroid
+xblock==1.5.1
+    # via
+    #   -r requirements/base.txt
+    #   xblock-utils
+xblock-sdk==0.4.0
+    # via -r requirements/quality.in
+xblock-utils==2.2.0
+    # via -r requirements/base.txt
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/requirements/test.txt b/requirements/test.txt
index 87a4e104b2c5b8003ed32af1f2dce2a2f336b070..8ba21350d1cbcd89278e8b058a366c5c5cfc5eab 100644
--- a/requirements/test.txt
+++ b/requirements/test.txt
@@ -8,6 +8,10 @@ appdirs==1.4.4
     # via
     #   -r requirements/base.txt
     #   fs
+asgiref==3.4.1
+    # via
+    #   -r requirements/base.txt
+    #   django
 astroid==2.8.4
     # via
     #   pylint
@@ -16,9 +20,9 @@ bleach==4.1.0
     # via
     #   -r requirements/base.txt
     #   readme-renderer
-boto3==1.20.4
+boto3==1.20.37
     # via fs-s3fs
-botocore==1.23.4
+botocore==1.23.37
     # via
     #   boto3
     #   s3transfer
@@ -26,9 +30,7 @@ certifi==2021.10.8
     # via
     #   -r requirements/base.txt
     #   requests
-cffi==1.15.0
-    # via cryptography
-charset-normalizer==2.0.7
+charset-normalizer==2.0.10
     # via
     #   -r requirements/base.txt
     #   requests
@@ -43,17 +45,16 @@ code-annotations==1.2.0
     # via edx-lint
 colorama==0.4.4
     # via twine
-coverage==6.1.2
+coverage==6.2
     # via coveralls
 coveralls==3.3.1
     # via -r requirements/test.in
-cryptography==35.0.0
-    # via secretstorage
 ddt==1.4.4
     # via -r requirements/test.in
     # via
     #   -c requirements/common_constraints.txt
     #   -r requirements/base.txt
+    #   -r requirements/test.in
     #   django-config-models
     #   django-crum
     #   django-filter
@@ -62,7 +63,7 @@ ddt==1.4.4
     #   edx-django-utils
     #   jsonfield
     #   xblock-sdk
-django-config-models==2.2.0
+django-config-models==2.2.2
     # via
     #   -c requirements/constraints.txt
     #   -r requirements/base.txt
@@ -74,11 +75,11 @@ django-filter==21.1
     # via -r requirements/base.txt
 django-pyfs==3.1.0
     # via -r requirements/test.in
-django-waffle==2.2.1
+django-waffle==2.3.0
     # via
     #   -r requirements/base.txt
     #   edx-django-utils
-djangorestframework==3.12.4
+djangorestframework==3.13.1
     # via
     #   -c requirements/constraints.txt
     #   -r requirements/base.txt
@@ -86,9 +87,9 @@ djangorestframework==3.12.4
     #   django-config-models
 docopt==0.6.2
     # via coveralls
-docutils==0.18
+docutils==0.18.1
     # via readme-renderer
-edx-django-utils==4.4.0
+edx-django-utils==4.4.1
     # via
     #   -r requirements/base.txt
     #   django-config-models
@@ -96,7 +97,7 @@ edx-lint==5.2.1
     # via -r requirements/test.in
 edx-opaque-keys[django]==2.2.2
     # via -r requirements/base.txt
-fs==2.4.13
+fs==2.4.14
     # via
     #   -r requirements/base.txt
     #   django-pyfs
@@ -112,16 +113,12 @@ idna==3.3
     # via
     #   -r requirements/base.txt
     #   requests
-importlib-metadata==4.8.2
+importlib-metadata==4.10.1
     # via
     #   keyring
     #   twine
 isort==5.10.1
     # via pylint
-jeepney==0.7.1
-    # via
-    #   keyring
-    #   secretstorage
 jinja2==3.0.3
     # via code-annotations
 jmespath==0.10.0
@@ -130,17 +127,17 @@ jmespath==0.10.0
     #   botocore
 jsonfield==3.1.0
     # via -r requirements/base.txt
-keyring==23.2.1
+keyring==23.5.0
     # via twine
 lazy==1.4
     # via -r requirements/base.txt
-lazy-object-proxy==1.6.0
+lazy-object-proxy==1.7.1
     # via astroid
-lxml==4.6.4
+lxml==4.7.1
     # via
     #   -r requirements/base.txt
     #   xblock
-mako==1.1.5
+mako==1.1.6
     # via
     #   -r requirements/base.txt
     #   xblock-utils
@@ -160,31 +157,29 @@ newrelic==7.2.4.171
     #   edx-django-utils
 oauthlib==3.1.1
     # via -r requirements/base.txt
-packaging==21.2
+packaging==21.3
     # via
     #   -r requirements/base.txt
     #   bleach
-pbr==5.7.0
+pbr==5.8.0
     # via
     #   -r requirements/base.txt
     #   stevedore
-pkginfo==1.7.1
+pkginfo==1.8.2
     # via twine
-platformdirs==2.4.0
+platformdirs==2.4.1
     # via pylint
-psutil==5.8.0
+psutil==5.9.0
     # via
     #   -r requirements/base.txt
     #   edx-django-utils
 pycodestyle==2.8.0
     # via -r requirements/test.in
-pycparser==2.21
-    # via cffi
-pycryptodomex==3.11.0
+pycryptodomex==3.12.0
     # via
     #   -r requirements/base.txt
     #   pyjwkest
-pygments==2.10.0
+pygments==2.11.2
     # via readme-renderer
 pyjwkest==1.4.2
     # via -r requirements/base.txt
@@ -196,17 +191,17 @@ pylint==2.11.1
     #   pylint-plugin-utils
 pylint-celery==0.3
     # via edx-lint
-pylint-django==2.4.4
+pylint-django==2.5.0
     # via edx-lint
-pylint-plugin-utils==0.6
+pylint-plugin-utils==0.7
     # via
     #   pylint-celery
     #   pylint-django
-pymongo==3.12.1
+pymongo==4.0.1
     # via
     #   -r requirements/base.txt
     #   edx-opaque-keys
-pyparsing==2.4.7
+pyparsing==3.0.6
     # via
     #   -r requirements/base.txt
     #   packaging
@@ -221,6 +216,7 @@ pytz==2021.3
     # via
     #   -r requirements/base.txt
     #   django
+    #   djangorestframework
     #   fs
     #   xblock
 pyyaml==6.0
@@ -228,11 +224,11 @@ pyyaml==6.0
     #   -r requirements/base.txt
     #   code-annotations
     #   xblock
-readme-renderer==30.0
+readme-renderer==32.0
     # via
     #   -r requirements/test.in
     #   twine
-requests==2.26.0
+requests==2.27.1
     # via
     #   -r requirements/base.txt
     #   coveralls
@@ -241,13 +237,11 @@ requests==2.26.0
     #   twine
 requests-toolbelt==0.9.1
     # via twine
-rfc3986==1.5.0
+rfc3986==2.0.0
     # via twine
 s3transfer==0.5.0
     # via boto3
-secretstorage==3.3.1
-    # via keyring
-simplejson==3.17.5
+simplejson==3.17.6
     # via
     #   -r requirements/base.txt
     #   xblock-utils
@@ -276,18 +270,18 @@ toml==0.10.2
     # via pylint
 tqdm==4.62.3
     # via twine
-twine==3.6.0
+twine==3.7.1
     # via -r requirements/test.in
-typing-extensions==3.10.0.2
+typing-extensions==4.0.1
     # via
     #   astroid
     #   pylint
-urllib3==1.26.7
+urllib3==1.26.8
     # via
     #   -r requirements/base.txt
     #   botocore
     #   requests
-web-fragments==1.1.0
+web-fragments==2.0.0
     # via
     #   -r requirements/base.txt
     #   xblock
@@ -310,7 +304,7 @@ xblock-sdk==0.4.0
     # via -r requirements/test.in
 xblock-utils==2.2.0
     # via -r requirements/base.txt
-zipp==3.6.0
+zipp==3.7.0
     # via importlib-metadata
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/tox.txt b/requirements/tox.txt
index 13cfe6273a82ec4a44e9767c06eb3757aa9e8ad1..3e47a84f2ab174e9d337d4a5c22e4a7772a4896f 100644
--- a/requirements/tox.txt
+++ b/requirements/tox.txt
@@ -4,23 +4,21 @@
 #
 #    make upgrade
 #
-backports.entry-points-selectable==1.1.1
+distlib==0.3.4
     # via virtualenv
-distlib==0.3.3
-    # via virtualenv
-filelock==3.3.2
+filelock==3.4.2
     # via
     #   tox
     #   virtualenv
-packaging==21.2
+packaging==21.3
     # via tox
-platformdirs==2.4.0
+platformdirs==2.4.1
     # via virtualenv
 pluggy==1.0.0
     # via tox
 py==1.11.0
     # via tox
-pyparsing==2.4.7
+pyparsing==3.0.6
     # via packaging
 six==1.16.0
     # via
@@ -28,7 +26,7 @@ six==1.16.0
     #   virtualenv
 toml==0.10.2
     # via tox
-tox==3.24.4
+tox==3.24.5
     # via -r requirements/tox.in
-virtualenv==20.10.0
+virtualenv==20.13.0
     # via tox
diff --git a/tox.ini b/tox.ini
index 46a5237e7bfa5cb5d2604f779ea63036c79ce618..3939b051acdaed344663aed53ac6293501eff993 100644
--- a/tox.ini
+++ b/tox.ini
@@ -18,6 +18,6 @@ commands =
 whitelist_externals =
 	make
 deps =
-	-r{toxinidir}/requirements/test.txt
+	-r{toxinidir}/requirements/quality.txt
 commands =
 	make quality