diff --git a/b2sdk/v1/exception.py b/b2sdk/v1/exception.py
index cf149a68..7815a28f 100644
--- a/b2sdk/v1/exception.py
+++ b/b2sdk/v1/exception.py
@@ -18,6 +18,7 @@ from b2sdk.exception import B2HttpCallbackException
 from b2sdk.exception import B2HttpCallbackPostRequestException
 from b2sdk.exception import B2HttpCallbackPreRequestException
 from b2sdk.exception import B2RequestTimeout
+from b2sdk.exception import B2RequestTimeoutDuringUpload
 from b2sdk.exception import B2SimpleError
 from b2sdk.exception import BadDateFormat
 from b2sdk.exception import BadFileInfo
@@ -73,6 +74,7 @@ __all__ = (
     'B2HttpCallbackPostRequestException',
     'B2HttpCallbackPreRequestException',
     'B2RequestTimeout',
+    'B2RequestTimeoutDuringUpload',
     'B2SimpleError',
     'BadDateFormat',
     'BadFileInfo',

diff --git a/test/v1/test_bucket.py b/test/v1/test_bucket.py
index ec085c86..87c98d0f 100644
--- a/test/v1/test_bucket.py
+++ b/test/v1/test_bucket.py
@@ -21,6 +21,7 @@ from .test_base import TestBase
 from .deps_exception import (
     AlreadyFailed,
     B2Error,
+    B2RequestTimeoutDuringUpload,
     InvalidAuthToken,
     InvalidMetadataDirective,
     InvalidRange,
@@ -452,6 +453,11 @@ class TestUpload(TestCaseWithBucket):
         data = six.b('hello world')
         self.bucket.upload_bytes(data, 'file1')
 
+    def test_upload_timeout(self):
+        self.simulator.set_upload_errors([B2RequestTimeoutDuringUpload()])
+        data = six.b('hello world')
+        self.bucket.upload_bytes(data, 'file1')
+
     def test_upload_file_one_fatal_error(self):
         self.simulator.set_upload_errors([CanRetry(False)])
         data = six.b('hello world')

400 bad_request more than one upload using auth token
I have a loop uploading files locally to B2 cloud. After a few thousand uploads over a few hours, I get this error:
`b2sdk.exception.UnknownError: Unknown error: 400 bad_request more than one upload using auth token 4_0021a87abca5e6b0000000005_018fe4f8_97f3ec_uplg_wANv-9n9ent4nLDoDI0yMFmZqeQ=`

I feel like upload_local_file method should be able to handle renegotiating a new auth token on its own rather than failing as such.
test/v1/test_bucket.py::TestUpload::test_upload_bytes test/v1/test_bucket.py::TestUpload::test_upload_bytes_progress test/v1/test_bucket.py::TestUpload::test_upload_large test/v1/test_bucket.py::TestUpload::test_upload_file_one_fatal_error test/v1/test_bucket.py::TestUpload::test_upload_large_file_with_restricted_api_key test/v1/test_bucket.py::TestUpload::test_upload_one_retryable_error test/v1/test_bucket.py::TestUpload::test_upload_large_resume_all_parts_there test/v1/test_bucket.py::TestUpload::test_upload_large_resume_file_info_does_not_match test/v1/test_bucket.py::TestUpload::test_upload_large_resume_file_info test/v1/test_bucket.py::TestUpload::test_upload_file_too_many_retryable_errors test/v1/test_bucket.py::TestUpload::test_upload_large_resume_wrong_part_size test/v1/test_bucket.py::TestUpload::test_upload_large_resume_part_does_not_match test/v1/test_bucket.py::TestUpload::test_upload_local_file test/v1/test_bucket.py::TestUpload::test_upload_timeout test/v1/test_bucket.py::TestUpload::test_upload_fifo test/v1/test_bucket.py::TestUpload::test_upload_large_resume test/v1/test_bucket.py::TestUpload::test_upload_large_resume_no_parts test/v1/test_bucket.py::TestUpload::test_upload_dead_symlink test/v1/test_bucket.py::TestDownloadDefault::test_download_by_name_no_progress test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_no_progress test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress_partial_inplace_overwrite test/v1/test_bucket.py::TestDownloadDefault::test_download_by_name_empty_file test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress_partial_shifted_overwrite test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress_exact_range test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress_range_one_off test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress test/v1/test_bucket.py::TestDownloadDefault::test_download_by_id_progress_partial test/v1/test_bucket.py::TestDownloadDefault::test_download_by_name_progress test/v1/test_bucket.py::TestListUnfinished::test_three test/v1/test_bucket.py::TestListUnfinished::test_one test/v1/test_bucket.py::TestListUnfinished::test_prefix test/v1/test_bucket.py::TestListUnfinished::test_empty test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress_partial_inplace_overwrite test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_name_no_progress test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress_range_one_off test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress_partial_shifted_overwrite test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress_partial test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_no_progress test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress_exact_range test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_name_progress test/v1/test_bucket.py::TestTruncatedDownloadParallel::test_download_by_id_progress test/v1/test_bucket.py::TestLs::test_three_files_multiple_versions test/v1/test_bucket.py::TestLs::test_started_large_file test/v1/test_bucket.py::TestLs::test_hidden_file test/v1/test_bucket.py::TestLs::test_one_file_at_root test/v1/test_bucket.py::TestLs::test_empty test/v1/test_bucket.py::TestLs::test_three_files_at_root test/v1/test_bucket.py::TestLs::test_delete_file_version test/v1/test_bucket.py::TestLs::test_three_files_in_dir test/v1/test_bucket.py::TestListParts::testEmpty test/v1/test_bucket.py::TestListParts::testThree test/v1/test_bucket.py::TestCopyFile::test_copy_with_replace_metadata test/v1/test_bucket.py::TestCopyFile::test_copy_with_invalid_metadata test/v1/test_bucket.py::TestCopyFile::test_copy_with_invalid_metadata_replace test/v1/test_bucket.py::TestCopyFile::test_copy_with_different_bucket test/v1/test_bucket.py::TestCopyFile::test_copy_without_optional_params test/v1/test_bucket.py::TestCopyFile::test_copy_with_unsatisfied_range test/v1/test_bucket.py::TestCopyFile::test_copy_with_range test/v1/test_bucket.py::TestUploadPart::test_error_in_state test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress_partial test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress_exact_range test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress_partial_shifted_overwrite test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress_range_one_off test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress_partial_inplace_overwrite test/v1/test_bucket.py::TestDownloadParallel::test_download_by_name_no_progress test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_progress test/v1/test_bucket.py::TestDownloadParallel::test_download_by_id_no_progress test/v1/test_bucket.py::TestDownloadParallel::test_download_by_name_progress test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_no_progress test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress_partial test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress_partial_shifted_overwrite test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress_partial_inplace_overwrite test/v1/test_bucket.py::TestDownloadSimple::test_download_by_name_no_progress test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress_exact_range test/v1/test_bucket.py::TestDownloadSimple::test_download_by_id_progress_range_one_off test/v1/test_bucket.py::TestDownloadSimple::test_download_by_name_progress test/v1/test_bucket.py::TestDownloadSimple::test_download_by_name_empty_file test/v1/test_bucket.py::TestReauthorization::testCreateBucket test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_name_progress test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress_partial test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress_range_one_off test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress_exact_range test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress_partial_inplace_overwrite test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_progress_partial_shifted_overwrite test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_id_no_progress test/v1/test_bucket.py::TestTruncatedDownloadSimple::test_download_by_name_no_progress