diff --git a/functional_tests/test_auto_logout.py b/functional_tests/test_auto_logout.py
index ecdfa41f42d3c4c28eb544c226fdcfbbfb952ce2..ec268c7340359167e1de5f8403ac8ad675b599de 100644
--- a/functional_tests/test_auto_logout.py
+++ b/functional_tests/test_auto_logout.py
@@ -1,5 +1,4 @@
 import datetime
-import time
 import logging
 from django.test import LiveServerTestCase
 from selenium import webdriver
@@ -45,7 +44,7 @@ class TestAutoLogout(LiveServerTestCase):
 
     def test_auto_logout_can_continue(self):
         with self.settings(JWT_AUTH={
-            'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=5),
+            'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=15),
             'JWT_ALLOW_REFRESH': True,
         }
         ):
@@ -54,12 +53,11 @@ class TestAutoLogout(LiveServerTestCase):
                 'return sessionStorage["token"]'
             )
             logout_dialog = self.browser.find_element_by_id('logout-dialog')
-            WebDriverWait(self.browser, 5).until(
+            WebDriverWait(self.browser, 15).until(
                 ec.visibility_of_element_located((By.ID, 'logout-dialog')))
             logout_dialog.find_element_by_id('continue-btn').click()
-            # explicit sleep is unfortunately necessary here, since we need to wait
-            # for the initial token to expire and the site to be the same
-            time.sleep(2)
+            WebDriverWait(self.browser, 10).until(
+                ec.invisibility_of_element_located((By.ID, 'logout-dialog')))
             self.assertNotIn('login', self.browser.current_url)
             new_token = self.browser.execute_script(
                 'return sessionStorage["token"]'
diff --git a/functional_tests/test_export_modal.py b/functional_tests/test_export_modal.py
index fbc3b130b1ab14afd9704ef7a157591d59027eba..5c4da4fefe490f437bc2f8511404da21404a7754 100644
--- a/functional_tests/test_export_modal.py
+++ b/functional_tests/test_export_modal.py
@@ -47,7 +47,7 @@ class ExportTestModal(LiveServerTestCase):
 
         fact.SubmissionFactory()
         self._login()
-        WebDriverWait(self.browser, 3).until(export_btn_is_red)
+        WebDriverWait(self.browser, 10).until(export_btn_is_red)
 
     def test_export_warning_tooltip_uncorrected_submissions(self):
         fact.SubmissionFactory()
diff --git a/functional_tests/test_feedback_creation.py b/functional_tests/test_feedback_creation.py
index 74486392b1adcedbff039447467284de14f1fb19..f34e2e5f565b16d488cb8ee75df810b74ff45ee8 100644
--- a/functional_tests/test_feedback_creation.py
+++ b/functional_tests/test_feedback_creation.py
@@ -55,20 +55,20 @@ class UntestedParent:
         # stage can be 'initial', 'validate', or 'conflict'
         def _go_to_subscription(self, stage='initial', sub_type=None):
             tasks = self.browser.find_element_by_name('subscription-list')
-            WebDriverWait(self.browser, 3).until(subscriptions_loaded_cond(tasks))
+            WebDriverWait(self.browser, 10).until(subscriptions_loaded_cond(tasks))
             tab = tasks.find_element_by_xpath(f'//*[contains(text(), "{stage}")]')
             tab.click()
             sub_type = sub_type if sub_type is not None else self.sub_type
 
             sub_type_xpath = f'//*[contains(text(), "{sub_type.name}") ' \
                 f'and not(contains(@class, "inactive"))]'
-            WebDriverWait(self.browser, 3).until(
+            WebDriverWait(self.browser, 10).until(
                 ec.element_to_be_clickable((By.XPATH, sub_type_xpath)),
                 message="SubmissionType not clickable"
             )
             sub_type_el = tasks.find_element_by_xpath(sub_type_xpath)
             sub_type_el.click()
-            WebDriverWait(self.browser, 3).until(ec.url_contains('subscription'))
+            WebDriverWait(self.browser, 10).until(ec.url_contains('subscription'))
 
         def write_comments_on_lines(self, line_comment_tuples):
             """ line_comment_tuples is an iterable containing tuples of
@@ -120,7 +120,7 @@ class UntestedParent:
             self.assertIn(test.name, name_label.text)
             self.assertIn(test.label, name_label.text)
             test_output = tests.find_element_by_name('test-output')
-            WebDriverWait(self.browser, 3).until(ec.visibility_of(test_output))
+            WebDriverWait(self.browser, 10).until(ec.visibility_of(test_output))
             self.assertEqual(test.annotation, test_output.text)
 
         def wait_until_code_changes(self, code):
@@ -140,7 +140,7 @@ class UntestedParent:
             self.browser.find_element_by_id('score-full').click()
             submit_btn = self.browser.find_element_by_id('submit-feedback')
             submit_btn.click()
-            WebDriverWait(self.browser, 3).until(
+            WebDriverWait(self.browser, 10).until(
                 self.wait_until_code_changes(code)
             )
             submission_for_code = Submission.objects.get(text=code)
@@ -162,7 +162,7 @@ class UntestedParent:
             self.browser.find_element_by_id('score-zero').click()
             self.write_comments_on_lines([(0, 'A comment')])
             self.browser.find_element_by_id('submit-feedback').click()
-            WebDriverWait(self.browser, 3).until(self.wait_until_code_changes(code))
+            WebDriverWait(self.browser, 10).until(self.wait_until_code_changes(code))
             submission_for_code = Submission.objects.get(text=code)
             self.assertEqual(0, submission_for_code.feedback.score)
 
@@ -183,7 +183,7 @@ class UntestedParent:
 
             submit_btn = self.browser.find_element_by_id('submit-feedback')
             submit_btn.click()
-            WebDriverWait(self.browser, 3).until(
+            WebDriverWait(self.browser, 10).until(
                 self.wait_until_code_changes(code)
             )
             submission_for_code = Submission.objects.get(text=code)
@@ -206,7 +206,7 @@ class UntestedParent:
             self._go_to_subscription()
             code = self._reconstruct_submission_code()
             self.browser.find_element_by_id('skip-submission').click()
-            WebDriverWait(self.browser, 3).until(self.wait_until_code_changes(code))
+            WebDriverWait(self.browser, 10).until(self.wait_until_code_changes(code))
 
         def test_can_validate_submission(self):
             self._login()
@@ -215,7 +215,7 @@ class UntestedParent:
             self.write_comments_on_lines([(0, 'A comment by me')])
             self.browser.find_element_by_id('score-zero').click()
             self.browser.find_element_by_id('submit-feedback').click()
-            WebDriverWait(self.browser, 3).until(self.wait_until_code_changes(code))
+            WebDriverWait(self.browser, 10).until(self.wait_until_code_changes(code))
             reset_browser_after_test(self.browser, self.live_server_url)  # logs out user
 
             user_snd = 'tutor_snd'
@@ -227,7 +227,7 @@ class UntestedParent:
             self.write_comments_on_lines([(0, 'I disagree'), (1, 'Full points!')])
             self.browser.find_element_by_id('score-full').click()
             self.browser.find_element_by_id('submit-feedback').click()
-            WebDriverWait(self.browser, 5).until(ec.url_contains('subscription/ended'))
+            WebDriverWait(self.browser, 10).until(ec.url_contains('subscription/ended'))
             submission_for_code = Submission.objects.get(text=code)
             self.assertEqual(self.sub_type.full_score, submission_for_code.feedback.score)
             self.assertEqual(3, submission_for_code.feedback.feedback_lines.count())
diff --git a/functional_tests/test_front_pages.py b/functional_tests/test_front_pages.py
index ff2254a460fc0d9d86198d00e46b3ca60286411e..c24400e29d7914342fc2c602b0b0d61a7aaf9730 100644
--- a/functional_tests/test_front_pages.py
+++ b/functional_tests/test_front_pages.py
@@ -50,7 +50,7 @@ class UntestedParent:
             tasks = self.browser.find_element_by_name('subscription-list')
             title = tasks.find_element_by_class_name('v-toolbar__title')
             self.assertEqual('Tasks', title.text)
-            WebDriverWait(self.browser, 6).until(subscriptions_loaded_cond(tasks))
+            WebDriverWait(self.browser, 10).until(subscriptions_loaded_cond(tasks))
             subscription_links = extract_hrefs_hashes(
                 tasks.find_elements_by_tag_name('a')
             )
diff --git a/functional_tests/test_login_page.py b/functional_tests/test_login_page.py
index 23d5fb5d4533e945e0295634bd13229fed877515..ede4aee70b2326cabbbd47fa5788ddc75bd01339 100644
--- a/functional_tests/test_login_page.py
+++ b/functional_tests/test_login_page.py
@@ -102,7 +102,7 @@ class LoginPageTest(LiveServerTestCase):
         password_input = self.browser.find_element_by_xpath('//input[@aria-label="Password"]')
         password_input.send_keys('p')
         self.browser.find_element_by_xpath('//button[@type="submit"]').send_keys(Keys.ENTER)
-        WebDriverWait(self.browser, 3).until(ec.url_contains('/home'))
+        WebDriverWait(self.browser, 10).until(ec.url_contains('/home'))
 
     def test_tutor_can_login(self):
         tutor = self.test_data['tutors'][0]
@@ -132,7 +132,7 @@ class LoginPageTest(LiveServerTestCase):
         password_input.send_keys(password)
         register_submit_el = self.browser.find_element_by_id('register-submit')
         register_submit_el.click()
-        WebDriverWait(self.browser, 3).until_not(ec.visibility_of(register_submit_el))
+        WebDriverWait(self.browser, 10).until_not(ec.visibility_of(register_submit_el))
         tutor = UserAccount.objects.get(username=username)
         self.assertEqual(UserAccount.TUTOR, tutor.role)
         self.assertFalse(tutor.is_active, "Tutors should be inactive after registered")
diff --git a/functional_tests/util.py b/functional_tests/util.py
index d6ca543483faa91504f23942d6b81f4ff25157be..7a45ec5a684255ea8d02ede80af4ecaa8f1287a3 100644
--- a/functional_tests/util.py
+++ b/functional_tests/util.py
@@ -26,7 +26,7 @@ def login(browser, live_server_url, username, password='p'):
     password_input = browser.find_element_by_xpath('//input[@aria-label="Password"]')
     password_input.send_keys(password)
     browser.find_element_by_xpath('//button[@type="submit"]').send_keys(Keys.ENTER)
-    WebDriverWait(browser, 3).until(ec.url_contains('/home'))
+    WebDriverWait(browser, 10).until(ec.url_contains('/home'))
 
 
 def reset_browser_after_test(browser: webdriver.Firefox, live_server_url):