diff --git a/bot/reviewbot/__init__.py b/bot/reviewbot/__init__.py
index 62461340831b179a260f4bf43cd8198d32bbc758..c77917a789e6b6c9bb6d2bded2e139a9b3b5c0ac 100644
--- a/bot/reviewbot/__init__.py
+++ b/bot/reviewbot/__init__.py
@@ -1,4 +1,3 @@
-
 #: The version of Review Bot.
 #:
 #: This is in the format of:
diff --git a/bot/reviewbot/celery.py b/bot/reviewbot/celery.py
index 419af366cfd635a4579ba7daa0d5fc47500b6966..63bf46bfee635a09fc83aba2f785fbd0047877b6 100644
--- a/bot/reviewbot/celery.py
+++ b/bot/reviewbot/celery.py
@@ -1,6 +1,6 @@
 """Celery and Review Bot worker setup and management."""
 
-from __future__ import absolute_import, unicode_literals
+from __future__ import annotations
 
 import os
 import sys
@@ -11,17 +11,11 @@ from celery import (Celery,
                     __version__ as celery_version_str,
                     concurrency as celery_concurrency,
                     maybe_patch_concurrency)
+from celery.bin.worker import detach as detach_process
 from celery.platforms import maybe_drop_privileges
 from celery.signals import celeryd_after_setup, celeryd_init
 from kombu import Exchange, Queue
 
-try:
-    # Celery 5, Python 3+
-    from celery.bin.worker import detach as detach_process
-except ImportError:
-    # Celery 3, Python 2.7
-    from celery.bin.celeryd_detach import detach as detach_process
-
 from reviewbot import VERSION
 from reviewbot.config import config, get_config_file_path, load_config
 from reviewbot.repositories import repositories, init_repositories
diff --git a/bot/reviewbot/config.py b/bot/reviewbot/config.py
index a86a9798da7eeac8975e4ca1b676cfc6902da01d..2219fcdf56976f4a6e237e8bc88375a2a13ac41b 100644
--- a/bot/reviewbot/config.py
+++ b/bot/reviewbot/config.py
@@ -1,11 +1,10 @@
 """Configuration loading and validation."""
 
-from __future__ import print_function, unicode_literals
+from __future__ import annotations
 
 import json
 import os
 from copy import deepcopy
-from glob import glob
 
 import six
 from appdirs import AppDirs
diff --git a/bot/reviewbot/deprecation.py b/bot/reviewbot/deprecation.py
index d7dc6e26151483fc8f4f1ae9ea6b5e9a5bb4ebcd..7c1f1cb84fd36c8b27eb66cd46bdd32cd0b3cc0f 100644
--- a/bot/reviewbot/deprecation.py
+++ b/bot/reviewbot/deprecation.py
@@ -8,7 +8,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import warnings
 
diff --git a/bot/reviewbot/errors.py b/bot/reviewbot/errors.py
index 87ef736de92e3e4b35fd8edfef6a244be6907acc..7cf6840aca865bd0c5ee4608f13b44777f9bc824 100644
--- a/bot/reviewbot/errors.py
+++ b/bot/reviewbot/errors.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 
 class SuspiciousFilePath(Exception):
diff --git a/bot/reviewbot/main.py b/bot/reviewbot/main.py
index bc593601e7669cb8670712348ff7bb3fae3ef1a1..f6630b90fc9af3383a882e65f8257a9a2ccb6893 100644
--- a/bot/reviewbot/main.py
+++ b/bot/reviewbot/main.py
@@ -4,10 +4,9 @@ Version Added:
     3.0
 """
 
-from __future__ import absolute_import, unicode_literals
+from __future__ import annotations
 
 import argparse
-import os
 import socket
 import sys
 
diff --git a/bot/reviewbot/processing/review.py b/bot/reviewbot/processing/review.py
index 2f491aefe245094742610bd957f8ebb5fc7f970a..4ba5b6ef56a58759c8fcff3bdd6a902e77cb3624 100644
--- a/bot/reviewbot/processing/review.py
+++ b/bot/reviewbot/processing/review.py
@@ -1,4 +1,4 @@
-from __future__ import division, unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/processing/tests/test_file.py b/bot/reviewbot/processing/tests/test_file.py
index 1f7bc08fe3fbd3c803888b8e415bc4fb55a67b2c..2b9529a690e242f44fbd079f6215355d98e8a5b1 100644
--- a/bot/reviewbot/processing/tests/test_file.py
+++ b/bot/reviewbot/processing/tests/test_file.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.processing.review.File."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/processing/tests/test_review.py b/bot/reviewbot/processing/tests/test_review.py
index 6c2840652d8fcaa9fbd8fc767e83ad9c5c739455..c7abebc5a9cf5760c0e1626581e03d954ccaeef3 100644
--- a/bot/reviewbot/processing/tests/test_review.py
+++ b/bot/reviewbot/processing/tests/test_review.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import kgb
 
diff --git a/bot/reviewbot/repositories.py b/bot/reviewbot/repositories.py
index 1a2bc0cdd116524bc7483ebed5bd80011730a383..d9aa16fca30baf54ec274b2ecbb4489fee455932 100644
--- a/bot/reviewbot/repositories.py
+++ b/bot/reviewbot/repositories.py
@@ -1,6 +1,6 @@
 """Full access repository management."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 from uuid import uuid4
diff --git a/bot/reviewbot/tasks.py b/bot/reviewbot/tasks.py
index 77ee6dc13896f51e638ed931ce2cfac2caa19e5d..3bd4e1b0fb6b5326c5faecd4f29369f1b36863dc 100644
--- a/bot/reviewbot/tasks.py
+++ b/bot/reviewbot/tasks.py
@@ -1,6 +1,6 @@
 """Core task handling."""
 
-from __future__ import absolute_import, unicode_literals
+from __future__ import annotations
 
 import json
 
diff --git a/bot/reviewbot/testing/__init__.py b/bot/reviewbot/testing/__init__.py
index 9e485d320a9e2199066d28765d0ceb854dc7c563..9b8bd588004e06c41daf5e9bf745cdeb63b0f491 100644
--- a/bot/reviewbot/testing/__init__.py
+++ b/bot/reviewbot/testing/__init__.py
@@ -1,6 +1,6 @@
 """Unit testing utilities for Review Bot."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.testing.testcases import TestCase
 from reviewbot.testing.utils import get_test_dep_path
diff --git a/bot/reviewbot/testing/testcases.py b/bot/reviewbot/testing/testcases.py
index 64a7f017b59fa3456b98a12e9ff4bd062e44b832..a6240c28f6731718b94acd5dfb8c0d3fecd22bc5 100644
--- a/bot/reviewbot/testing/testcases.py
+++ b/bot/reviewbot/testing/testcases.py
@@ -4,21 +4,15 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import pprint
 import re
+import unittest
 from contextlib import contextmanager
 from copy import deepcopy
 
-try:
-    # Python 2
-    import unittest2 as unittest
-except ImportError:
-    # Python 3
-    import unittest
-
 import six
 from rbtools.api.resource import (FileAttachmentListResource,
                                   FileDiffResource,
diff --git a/bot/reviewbot/testing/utils.py b/bot/reviewbot/testing/utils.py
index 716aac152fd91cbb044a342aee39868c0a391b27..6427a1df791f5c873fa5133b2c1fa792d3420687 100644
--- a/bot/reviewbot/testing/utils.py
+++ b/bot/reviewbot/testing/utils.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tests/test_celery.py b/bot/reviewbot/tests/test_celery.py
index dff7374600c9364e2a9416477857c63a11110930..10594ced8e082a48a3409f722270caf2d866da8c 100644
--- a/bot/reviewbot/tests/test_celery.py
+++ b/bot/reviewbot/tests/test_celery.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.celery."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import re
diff --git a/bot/reviewbot/tests/test_config.py b/bot/reviewbot/tests/test_config.py
index 35e2fc947e7b4b42da407259376eb626f28f9520..143146c9ea0b7bb6c7ddbfcfd1d5adfde79b5a29 100644
--- a/bot/reviewbot/tests/test_config.py
+++ b/bot/reviewbot/tests/test_config.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.config."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tests/test_repositories.py b/bot/reviewbot/tests/test_repositories.py
index a6e81b9274a644a476db0c52c5c9cd27282037d0..b2e851bcf02cbd34b6a78039eed4e1f4d5ab4c1e 100644
--- a/bot/reviewbot/tests/test_repositories.py
+++ b/bot/reviewbot/tests/test_repositories.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.repositories."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import kgb
 
diff --git a/bot/reviewbot/tests/test_tasks.py b/bot/reviewbot/tests/test_tasks.py
index aa5baffe0f91a3848548e639d63973f63347631a..b897c2af708a72db291ff5177773ea7fba1aff96 100644
--- a/bot/reviewbot/tests/test_tasks.py
+++ b/bot/reviewbot/tests/test_tasks.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tasks."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import kgb
 from celery.worker.control import Panel
diff --git a/bot/reviewbot/tools/__init__.py b/bot/reviewbot/tools/__init__.py
index 785e46e246baac0d88a47f883dc2911ad58ba075..1e44e2b66d3e98ef4f582122fbdab9b416cf5e9d 100644
--- a/bot/reviewbot/tools/__init__.py
+++ b/bot/reviewbot/tools/__init__.py
@@ -1,6 +1,6 @@
 """Base support for code checking tools."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.deprecation import RemovedInReviewBot40Warning
 from reviewbot.tools.base import BaseTool, FullRepositoryToolMixin
diff --git a/bot/reviewbot/tools/base/__init__.py b/bot/reviewbot/tools/base/__init__.py
index a000195717f12edca1adb35ce2d2d2ebf154e877..ebf1f01c55adedf0d307fc3395e334a0193b83bb 100644
--- a/bot/reviewbot/tools/base/__init__.py
+++ b/bot/reviewbot/tools/base/__init__.py
@@ -8,7 +8,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.tools.base.tool import BaseTool
 from reviewbot.tools.base.mixins import (FilePatternsFromSettingMixin,
diff --git a/bot/reviewbot/tools/base/mixins.py b/bot/reviewbot/tools/base/mixins.py
index 327703f063c0a4e2b96bec64ba339c7729a61a27..2ebecac2a8283476c6c34c57edc440d6dcb8cf90 100644
--- a/bot/reviewbot/tools/base/mixins.py
+++ b/bot/reviewbot/tools/base/mixins.py
@@ -4,13 +4,13 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import re
 
 from reviewbot.config import config
-from reviewbot.utils.filesystem import chdir, ensure_dirs_exist
+from reviewbot.utils.filesystem import chdir
 from reviewbot.utils.process import execute
 from reviewbot.utils.text import split_comma_separated
 
diff --git a/bot/reviewbot/tools/base/registry.py b/bot/reviewbot/tools/base/registry.py
index f961f374c95db44c3b85c6e51ee4ad084eaeed12..6fb32bd16771c5b7ae37bf28382c2b74fd7254ae 100644
--- a/bot/reviewbot/tools/base/registry.py
+++ b/bot/reviewbot/tools/base/registry.py
@@ -6,7 +6,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import pkg_resources
 
diff --git a/bot/reviewbot/tools/base/tool.py b/bot/reviewbot/tools/base/tool.py
index 7d4829ba15fa5b44902d138898c3150ccc164d70..c5fb5e2796bd681d4eabdaf320e722e9e9aec47d 100644
--- a/bot/reviewbot/tools/base/tool.py
+++ b/bot/reviewbot/tools/base/tool.py
@@ -1,6 +1,6 @@
 """Base support for creating code checking tools."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from fnmatch import fnmatchcase
 
diff --git a/bot/reviewbot/tools/cargotool.py b/bot/reviewbot/tools/cargotool.py
index 7d96e1c2afcd4d479c60ea6ed6ac23170cec5d1a..c6efc9a2e4f3052bc83f377c670f9a5429366531 100644
--- a/bot/reviewbot/tools/cargotool.py
+++ b/bot/reviewbot/tools/cargotool.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run Cargo commands."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/checkstyle.py b/bot/reviewbot/tools/checkstyle.py
index 1a66838accf411701c9845d8798033ab1a1e444d..9810e4b6e6ebecd2cbc21656cd29b9fefc12d726 100644
--- a/bot/reviewbot/tools/checkstyle.py
+++ b/bot/reviewbot/tools/checkstyle.py
@@ -1,11 +1,9 @@
 """Review Bot tool to run checkstyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
-import logging
 from xml.etree import ElementTree
 
-from reviewbot.config import config
 from reviewbot.tools.base import BaseTool, JavaToolMixin
 from reviewbot.utils.filesystem import make_tempfile
 from reviewbot.utils.process import execute
diff --git a/bot/reviewbot/tools/clang.py b/bot/reviewbot/tools/clang.py
index 9b063df65dcaf8041325fa4b168561457d4cbf60..9ff895c4f16f4b57a73abac8089824bb84f4e579 100644
--- a/bot/reviewbot/tools/clang.py
+++ b/bot/reviewbot/tools/clang.py
@@ -1,16 +1,11 @@
 """Review Bot tool to run Clang."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
+import plistlib
 import shlex
-
-try:
-    # Python 3.x
-    from plistlib import load as plist_load
-except ImportError:
-    # Python 2.x
-    from plistlib import readPlist as plist_load
+from plistlib import load as plist_load
 
 from reviewbot.config import config
 from reviewbot.tools.base import BaseTool, FullRepositoryToolMixin
diff --git a/bot/reviewbot/tools/cppcheck.py b/bot/reviewbot/tools/cppcheck.py
index 0c338f26d053a7387e8da6de9c4f2709f434ec61..0faadfcacf80b3bad7ed95fad144614b1f6c37fa 100644
--- a/bot/reviewbot/tools/cppcheck.py
+++ b/bot/reviewbot/tools/cppcheck.py
@@ -1,26 +1,6 @@
-# Copyright (c) 2012 Ericsson Television Ltd
-# Author D Laird
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
 """Review Bot tool to run Cppcheck."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/cpplint.py b/bot/reviewbot/tools/cpplint.py
index 599f57d79ad1fe60a1baba703f8bfb5ae06537eb..7387de5431176a90ea5751bda20b5f74310b1133 100644
--- a/bot/reviewbot/tools/cpplint.py
+++ b/bot/reviewbot/tools/cpplint.py
@@ -1,26 +1,6 @@
-# Copyright (c) 2012 Ericsson Television Ltd
-# Author D Laird
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
 """Review Bot tool to run cpplint."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/doc8.py b/bot/reviewbot/tools/doc8.py
index b00fdc07d217d08ebfe7baf2f8f5257a09c9c74e..eceff65bc81bea18b291745a0fa095e2740ab24c 100644
--- a/bot/reviewbot/tools/doc8.py
+++ b/bot/reviewbot/tools/doc8.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run doc8."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/fbinfer.py b/bot/reviewbot/tools/fbinfer.py
index 66bc03c76e958cae48cee0968ed122b35c519d8a..01207ef157ed633f3d8e5a8b0260dc2fd4c58ce3 100644
--- a/bot/reviewbot/tools/fbinfer.py
+++ b/bot/reviewbot/tools/fbinfer.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run FBInfer."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/flake8.py b/bot/reviewbot/tools/flake8.py
index ff3b682dd08a2c9412242894ae9a1ac72d7d361b..d84c8530668e5ff6ae26f0b72d9d3398c312449c 100644
--- a/bot/reviewbot/tools/flake8.py
+++ b/bot/reviewbot/tools/flake8.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run flake8."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 
diff --git a/bot/reviewbot/tools/gofmt.py b/bot/reviewbot/tools/gofmt.py
index 5c8a96f0a08179600bf1613083a98ddff9709178..34202e24aea135a0ed976c72510af66ed869a65d 100644
--- a/bot/reviewbot/tools/gofmt.py
+++ b/bot/reviewbot/tools/gofmt.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run go fmt."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/gotool.py b/bot/reviewbot/tools/gotool.py
index d1586f520decc3ba27804ede3e9acbf24c4dd8c6..b53844f5358d014e0a2848a2fce7759eb409e28c 100644
--- a/bot/reviewbot/tools/gotool.py
+++ b/bot/reviewbot/tools/gotool.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run Go Tools."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/jshint.py b/bot/reviewbot/tools/jshint.py
index 9e1f3716cabc3c0c87c3bb4e6c57570d91004bf4..69ceef384768071537d34fa0f9e6606e52f9dadb 100644
--- a/bot/reviewbot/tools/jshint.py
+++ b/bot/reviewbot/tools/jshint.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run JSHint."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/pmd.py b/bot/reviewbot/tools/pmd.py
index 6e9b20eb379995043c4a075dd5fcd7b270c82690..67295f4fd57f2734623cd1fa1d54ca05390aee23 100644
--- a/bot/reviewbot/tools/pmd.py
+++ b/bot/reviewbot/tools/pmd.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run PMD."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/pycodestyle.py b/bot/reviewbot/tools/pycodestyle.py
index ed53958245c5412cd2ae55266c9f1791ddc44320..79a08280c2c1e16eca63feac3a2299abf9158509 100644
--- a/bot/reviewbot/tools/pycodestyle.py
+++ b/bot/reviewbot/tools/pycodestyle.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.pycodestyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.config import config
 from reviewbot.tools import BaseTool
diff --git a/bot/reviewbot/tools/pydocstyle.py b/bot/reviewbot/tools/pydocstyle.py
index 7dd8dd5ec3540a84cca3b97c121e84ed3830bb1d..2c4bd700b1d101f663ae4ec6795969f11edb969c 100644
--- a/bot/reviewbot/tools/pydocstyle.py
+++ b/bot/reviewbot/tools/pydocstyle.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run pydocstyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/pyflakes.py b/bot/reviewbot/tools/pyflakes.py
index ae3184a873925a0ec363f1dc3db3260739b11883..801b64d106560d9753013ce1aea7dd7170536e46 100644
--- a/bot/reviewbot/tools/pyflakes.py
+++ b/bot/reviewbot/tools/pyflakes.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run pyflakes."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/rbsecretscanner.py b/bot/reviewbot/tools/rbsecretscanner.py
index 035aefbde32041ca27ad9647da77426a92c73268..ddf25a7bfbe6b6722ac382339320d297d60887b7 100644
--- a/bot/reviewbot/tools/rbsecretscanner.py
+++ b/bot/reviewbot/tools/rbsecretscanner.py
@@ -1,6 +1,6 @@
 """Review Bot tool to check for hard-coded security credentials."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import base64
 import json
diff --git a/bot/reviewbot/tools/rubocop.py b/bot/reviewbot/tools/rubocop.py
index 48ba6f2a75c98bba4a17f7de2efb2ad86a05ba22..d51f773bbb2ad4ac4f689b211a7d02ea7bbe928f 100644
--- a/bot/reviewbot/tools/rubocop.py
+++ b/bot/reviewbot/tools/rubocop.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run rubocop."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 
diff --git a/bot/reviewbot/tools/rustfmt.py b/bot/reviewbot/tools/rustfmt.py
index 241cf736b5826cfc953ff8bef4320b2190812d47..f41926a831e14000fbe66cc570536813bfd1fe6e 100644
--- a/bot/reviewbot/tools/rustfmt.py
+++ b/bot/reviewbot/tools/rustfmt.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run rustfmt."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/shellcheck.py b/bot/reviewbot/tools/shellcheck.py
index a8d72da43e58d1dc8972e5cf667047a6d078ef18..1cce866aa78693cf5b71c33d97c61de967f93c9f 100644
--- a/bot/reviewbot/tools/shellcheck.py
+++ b/bot/reviewbot/tools/shellcheck.py
@@ -1,6 +1,6 @@
 """Review Bot tool to run shellcheck."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import re
diff --git a/bot/reviewbot/tools/testing/__init__.py b/bot/reviewbot/tools/testing/__init__.py
index e75614376c4157d234ad0f63691a9c2600cfb7f4..45a7009c49168d0bec5b6fec1af585487475e4ba 100644
--- a/bot/reviewbot/tools/testing/__init__.py
+++ b/bot/reviewbot/tools/testing/__init__.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.tools.testing.decorators import (integration_test,
                                                 simulation_test)
diff --git a/bot/reviewbot/tools/testing/decorators.py b/bot/reviewbot/tools/testing/decorators.py
index 0851cd7b19545358ab9fd98e1151582772fd64d6..c532f5996111b9329c59501ed66cc9d2b7109d94 100644
--- a/bot/reviewbot/tools/testing/decorators.py
+++ b/bot/reviewbot/tools/testing/decorators.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 
 def integration_test(**kwargs):
diff --git a/bot/reviewbot/tools/testing/testcases.py b/bot/reviewbot/tools/testing/testcases.py
index 53c48cf1a333cab8be8cc8218ddd885d48ed358d..d3b81e8e1f1a655226339d7548a7e9fbfdf4146f 100644
--- a/bot/reviewbot/tools/testing/testcases.py
+++ b/bot/reviewbot/tools/testing/testcases.py
@@ -4,10 +4,9 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
-import tempfile
 from copy import deepcopy
 from functools import wraps
 from unittest import SkipTest
diff --git a/bot/reviewbot/tools/tests/test_base_tool.py b/bot/reviewbot/tools/tests/test_base_tool.py
index c82ea7a57905bd07abf2a1690157860507c34ef6..f446a7e352e945132f0c670b9a65d2350827cda2 100644
--- a/bot/reviewbot/tools/tests/test_base_tool.py
+++ b/bot/reviewbot/tools/tests/test_base_tool.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.BaseTool."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import shutil
diff --git a/bot/reviewbot/tools/tests/test_cargotool.py b/bot/reviewbot/tools/tests/test_cargotool.py
index 1370d5f6cfb55cd9ebabed0847955f7af65a1d46..dfe135a82089c3a77951dd17b95f21576b56fed3 100644
--- a/bot/reviewbot/tools/tests/test_cargotool.py
+++ b/bot/reviewbot/tools/tests/test_cargotool.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.cargotool."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/tests/test_checkstyle.py b/bot/reviewbot/tools/tests/test_checkstyle.py
index dbc7b2584860acd556a6414f6523d17e5aad92d1..50316f9975debe0f0bc806e73291ade8432ca97f 100644
--- a/bot/reviewbot/tools/tests/test_checkstyle.py
+++ b/bot/reviewbot/tools/tests/test_checkstyle.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.checkstyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_clang.py b/bot/reviewbot/tools/tests/test_clang.py
index 5941b94cd497a9c5ab12063300aa0b9f1a2754a2..7c9457cbe674e386544136ed86af0506a9d1220c 100644
--- a/bot/reviewbot/tools/tests/test_clang.py
+++ b/bot/reviewbot/tools/tests/test_clang.py
@@ -1,15 +1,9 @@
 """Unit tests for reviewbot.tools.clang."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
-
-try:
-    # Python 3.x
-    from plistlib import writePlist as dump_plist
-except ImportError:
-    # Python 2.7
-    from plistlib import dump as dump_plist
+import plistlib
 
 import six
 
@@ -593,7 +587,7 @@ class ClangToolTests(BaseToolTestCase):
 
             if plist_data:
                 with open(cmdline[-1], 'wb') as fp:
-                    dump_plist(plist_data, fp)
+                    plistlib.dump(plist_data, fp)
             else:
                 # clang will delete the output file if there's a compiler
                 # error.
diff --git a/bot/reviewbot/tools/tests/test_cppcheck.py b/bot/reviewbot/tools/tests/test_cppcheck.py
index c80fc399f2da0620ff979ccee9182cff5e1e1475..0cef19e94d4f804fe23ccb4540143284927e0c59 100644
--- a/bot/reviewbot/tools/tests/test_cppcheck.py
+++ b/bot/reviewbot/tools/tests/test_cppcheck.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.cppcheck."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_cpplint.py b/bot/reviewbot/tools/tests/test_cpplint.py
index 2eb226836f79b82d6423ea4c1e009d5161fe3fab..85d353277faa4844b72c890515480cbbe3011b65 100644
--- a/bot/reviewbot/tools/tests/test_cpplint.py
+++ b/bot/reviewbot/tools/tests/test_cpplint.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.cpplint."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_doc8.py b/bot/reviewbot/tools/tests/test_doc8.py
index f567f47eca6d1487c3ae3b4904e74bd99cf06aa2..ff0bc2572fc69540b5e98d87efab8ac9a43ee85f 100644
--- a/bot/reviewbot/tools/tests/test_doc8.py
+++ b/bot/reviewbot/tools/tests/test_doc8.py
@@ -1,7 +1,6 @@
-# coding: utf-8
 """Unit tests for reviewbot.tools.doc8."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_fbinfer.py b/bot/reviewbot/tools/tests/test_fbinfer.py
index de56feed1d85412054c14c9bc341bd42010057d8..58be00d40f17ee39e67950c30866cd5434cfdedb 100644
--- a/bot/reviewbot/tools/tests/test_fbinfer.py
+++ b/bot/reviewbot/tools/tests/test_fbinfer.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.fbinfer."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/tests/test_file_patterns_from_setting_mixin.py b/bot/reviewbot/tools/tests/test_file_patterns_from_setting_mixin.py
index e0ff8a2d266704fe344aabc916c9556d66638e00..f516c3e5cd7922f3c28c856adb9ee244fb4a9d1e 100644
--- a/bot/reviewbot/tools/tests/test_file_patterns_from_setting_mixin.py
+++ b/bot/reviewbot/tools/tests/test_file_patterns_from_setting_mixin.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.base.mixins.FilePatternFromSettingMixin."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.testing import TestCase
 from reviewbot.tools.base.mixins import FilePatternsFromSettingMixin
diff --git a/bot/reviewbot/tools/tests/test_flake8.py b/bot/reviewbot/tools/tests/test_flake8.py
index 76b8908a91e90fda8c9e2807f1c374018c2d87c6..29d392e8b796e02ff07ecf99efb0f0d4b85d9a60 100644
--- a/bot/reviewbot/tools/tests/test_flake8.py
+++ b/bot/reviewbot/tools/tests/test_flake8.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.flake8."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 
diff --git a/bot/reviewbot/tools/tests/test_gofmt.py b/bot/reviewbot/tools/tests/test_gofmt.py
index 48625eee452a405bc88cb6433435202db6fe68a4..394681b398f5f61de69fca16662e5b0ac3e5a72f 100644
--- a/bot/reviewbot/tools/tests/test_gofmt.py
+++ b/bot/reviewbot/tools/tests/test_gofmt.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.gofmt."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_gotool.py b/bot/reviewbot/tools/tests/test_gotool.py
index 2d94f4fe0cd3d37052fb3cffaa753f1f1b588a75..f5a0582ed082a7d2147c409c918eecb8d4309a99 100644
--- a/bot/reviewbot/tools/tests/test_gotool.py
+++ b/bot/reviewbot/tools/tests/test_gotool.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.gotool."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import shutil
diff --git a/bot/reviewbot/tools/tests/test_java_tool_mixin.py b/bot/reviewbot/tools/tests/test_java_tool_mixin.py
index 4650063fae7a73911b5b0c3f05c6b9d9b8a22b06..bda1cbb1e9c8e6bb4abee3da8cb5f6f7f863b5ff 100644
--- a/bot/reviewbot/tools/tests/test_java_tool_mixin.py
+++ b/bot/reviewbot/tools/tests/test_java_tool_mixin.py
@@ -1,8 +1,6 @@
 """Unit tests for reviewbot.tools.base.mixins.JavaToolMixin."""
 
-from __future__ import unicode_literals
-
-import os
+from __future__ import annotations
 
 import kgb
 
diff --git a/bot/reviewbot/tools/tests/test_jshint.py b/bot/reviewbot/tools/tests/test_jshint.py
index b3c12f25dab0eddca6569e930e028d4943b95ec1..f90e519c69fbdf2d8f6d2604531794d7572b2932 100644
--- a/bot/reviewbot/tools/tests/test_jshint.py
+++ b/bot/reviewbot/tools/tests/test_jshint.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.jshint."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/tests/test_pmd.py b/bot/reviewbot/tools/tests/test_pmd.py
index dfea762b0ed9fe85d02a5a1adf2de32a75538938..3376464944e5ca4e566eadc9e86d6196b090d957 100644
--- a/bot/reviewbot/tools/tests/test_pmd.py
+++ b/bot/reviewbot/tools/tests/test_pmd.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.pmd."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/tests/test_pycodestyle.py b/bot/reviewbot/tools/tests/test_pycodestyle.py
index dbd3e8fecd08af639eeb676b5af3f7f1baf0ee5a..62a944b04cce38e619579acdd39d12686c880d67 100644
--- a/bot/reviewbot/tools/tests/test_pycodestyle.py
+++ b/bot/reviewbot/tools/tests/test_pycodestyle.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.pycodestyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_pydocstyle.py b/bot/reviewbot/tools/tests/test_pydocstyle.py
index e50cbb23bd0f402f58b7eda78ec6c81bd8c1ca4b..7ef4c528aadbc29063b9920ad64f1a977bbe93b0 100644
--- a/bot/reviewbot/tools/tests/test_pydocstyle.py
+++ b/bot/reviewbot/tools/tests/test_pydocstyle.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.pydocstyle."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_pyflakes.py b/bot/reviewbot/tools/tests/test_pyflakes.py
index bf9f4609ec851c8f89a76634b0599f1d24fd79c5..ca00e3b483d05aea8cf901b0e2c10c49d63f9948 100644
--- a/bot/reviewbot/tools/tests/test_pyflakes.py
+++ b/bot/reviewbot/tools/tests/test_pyflakes.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.pyflakes."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import kgb
 import six
diff --git a/bot/reviewbot/tools/tests/test_rbsecretscanner.py b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
index 6c0856e718ae0a3e8265ae505f1420c7549d68bc..c6ac6fa49542b688380a594c3623ce9bc0726f75 100644
--- a/bot/reviewbot/tools/tests/test_rbsecretscanner.py
+++ b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.rbsecretscanner."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import kgb
 import six
diff --git a/bot/reviewbot/tools/tests/test_registry.py b/bot/reviewbot/tools/tests/test_registry.py
index 0adafdff62153a3aba55c84983e0100fb88f2c93..5c835d93ed92d0977db450dbbcf35fb0fc381876 100644
--- a/bot/reviewbot/tools/tests/test_registry.py
+++ b/bot/reviewbot/tools/tests/test_registry.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.base.registry."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import re
 
diff --git a/bot/reviewbot/tools/tests/test_rubocop.py b/bot/reviewbot/tools/tests/test_rubocop.py
index ab719d782debf228e99fb53329f13464984cae25..15730dac476f1f0445fb720cd189f90ed96e4596 100644
--- a/bot/reviewbot/tools/tests/test_rubocop.py
+++ b/bot/reviewbot/tools/tests/test_rubocop.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.rubocop."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/tests/test_rustfmt.py b/bot/reviewbot/tools/tests/test_rustfmt.py
index d1c477c976e595b78775748cb8ffd64460256b41..b0bc79d5e36b1d9a003d8c6be5d40a3bf347f02a 100644
--- a/bot/reviewbot/tools/tests/test_rustfmt.py
+++ b/bot/reviewbot/tools/tests/test_rustfmt.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.rustfmt."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 
diff --git a/bot/reviewbot/tools/tests/test_shellcheck.py b/bot/reviewbot/tools/tests/test_shellcheck.py
index b6f675a219c252497641ab4dcb6a58255ad7b71d..ffe749cb407491f887c4c55e1cf7979cd1f22566 100644
--- a/bot/reviewbot/tools/tests/test_shellcheck.py
+++ b/bot/reviewbot/tools/tests/test_shellcheck.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.tools.shellcheck."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import json
 import os
diff --git a/bot/reviewbot/tools/utils/codeclimate.py b/bot/reviewbot/tools/utils/codeclimate.py
index 5908b25fbec8c09bbc4e0f8a6f2ad1c6960b58ef..8fcbd56a3412f155e1b3b12a4e41ab90a34647fc 100644
--- a/bot/reviewbot/tools/utils/codeclimate.py
+++ b/bot/reviewbot/tools/utils/codeclimate.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 
 def add_comment_from_codeclimate_issue(issue_payload, review_file):
diff --git a/bot/reviewbot/utils/api.py b/bot/reviewbot/utils/api.py
index e8f46109f076d2a2f3572ba3b5c4bde8565be7e1..9d193fef06b7063e894a93cd0ee55c98e7c5a621 100644
--- a/bot/reviewbot/utils/api.py
+++ b/bot/reviewbot/utils/api.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from rbtools.api.client import RBClient
 
diff --git a/bot/reviewbot/utils/filesystem.py b/bot/reviewbot/utils/filesystem.py
index 45ea96775883443dc759c1d68303f5f7cd689fed..cdfa1431fc8f2ebe32ae18b5cbf07098e574fc46 100644
--- a/bot/reviewbot/utils/filesystem.py
+++ b/bot/reviewbot/utils/filesystem.py
@@ -1,6 +1,6 @@
 """Utilities for filesystem operations and path normalization."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import ntpath
 import os
diff --git a/bot/reviewbot/utils/log.py b/bot/reviewbot/utils/log.py
index f28a0d647b23fa2ec66769cadb3a977d56112e33..457472ef442078cf8c4fe8634dde0db2b55a4958 100644
--- a/bot/reviewbot/utils/log.py
+++ b/bot/reviewbot/utils/log.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from celery.utils.log import (get_logger as _get_logger,
                               get_task_logger as _get_task_logger)
diff --git a/bot/reviewbot/utils/process.py b/bot/reviewbot/utils/process.py
index f03c7190585ab7fd3a490aa71eb24b65c62dca39..94f992e4b609279521afe1a7870644f2e5b371f8 100644
--- a/bot/reviewbot/utils/process.py
+++ b/bot/reviewbot/utils/process.py
@@ -1,6 +1,6 @@
 """Utility functions for Process invocation and management."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import subprocess
diff --git a/bot/reviewbot/utils/tests/test_filesystem.py b/bot/reviewbot/utils/tests/test_filesystem.py
index 008486ae120b258fce5df5ff2ac3a8b6a589971e..47cbe0aa84c8892a35309dd0b077f98d96af1338 100644
--- a/bot/reviewbot/utils/tests/test_filesystem.py
+++ b/bot/reviewbot/utils/tests/test_filesystem.py
@@ -4,7 +4,7 @@ Version Added:
     3.0
 """
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.errors import SuspiciousFilePath
 from reviewbot.testing import TestCase
diff --git a/bot/reviewbot/utils/tests/test_process.py b/bot/reviewbot/utils/tests/test_process.py
index fbd311fc67072b5100d1d50ffd41ed725aed8fc4..e5d97d75bc8fd587263a6cd5b98edb7b8d1a54e1 100644
--- a/bot/reviewbot/utils/tests/test_process.py
+++ b/bot/reviewbot/utils/tests/test_process.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.utils.process."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 import os
 import shutil
diff --git a/bot/reviewbot/utils/tests/test_text.py b/bot/reviewbot/utils/tests/test_text.py
index 7ccf442894c9703fdf02abde167dad418c63e96a..9f8dc227b42ae9e023ddb0b43f0051dfdf52ded1 100644
--- a/bot/reviewbot/utils/tests/test_text.py
+++ b/bot/reviewbot/utils/tests/test_text.py
@@ -1,6 +1,6 @@
 """Unit tests for reviewbot.utils.text."""
 
-from __future__ import unicode_literals
+from __future__ import annotations
 
 from reviewbot.testing import TestCase
 from reviewbot.utils.text import base62_encode, split_comma_separated
diff --git a/bot/reviewbot/utils/text.py b/bot/reviewbot/utils/text.py
index a73bba45303122d795d731dd839f2400a76f195f..d0b80c5226ba57671e9a19edfd81698651ea1aaf 100644
--- a/bot/reviewbot/utils/text.py
+++ b/bot/reviewbot/utils/text.py
@@ -1,6 +1,6 @@
 """Utility functions for working with text."""
 
-from __future__ import division, unicode_literals
+from __future__ import annotations
 
 import re
 
