diff --git a/contrib/client-tools/tor-resolve.py b/contrib/client-tools/tor-resolve.py
index 47ae1a0c381b7fbfc7e9fd9725c68a70f7ebbe56..593efc97d431e74c896ab67ff5a5e64c4519797d 100755
--- a/contrib/client-tools/tor-resolve.py
+++ b/contrib/client-tools/tor-resolve.py
@@ -1,5 +1,10 @@
 #!/usr/bin/python
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import socket
 import struct
 import sys
diff --git a/scripts/codegen/fuzzing_include_am.py b/scripts/codegen/fuzzing_include_am.py
index a9445844536fedd8ecf38edbc9fb27366e82b8c1..aa3ba49a73f57f48f6ceed6139254662eb2c5bbc 100755
--- a/scripts/codegen/fuzzing_include_am.py
+++ b/scripts/codegen/fuzzing_include_am.py
@@ -1,5 +1,10 @@
 #!/usr/bin/python
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 FUZZERS = """
 	consensus
 	descriptor
diff --git a/scripts/codegen/gen_server_ciphers.py b/scripts/codegen/gen_server_ciphers.py
index 5d326f8b9e97476c6b4909caef0c7006a2d0d730..dd295b7f7d6cda157ceee8cf02c29e528fd911be 100755
--- a/scripts/codegen/gen_server_ciphers.py
+++ b/scripts/codegen/gen_server_ciphers.py
@@ -8,6 +8,11 @@
 #
 # Run it on all the files in your openssl include directory.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import re
 import sys
 
diff --git a/scripts/codegen/get_mozilla_ciphers.py b/scripts/codegen/get_mozilla_ciphers.py
index f23f2f1e6f1ee7cd0d046ced750900326ed308e7..d149c71c27a9e5b7da7f047e7d475023bf4ae5c7 100755
--- a/scripts/codegen/get_mozilla_ciphers.py
+++ b/scripts/codegen/get_mozilla_ciphers.py
@@ -10,6 +10,11 @@
 # It takes two arguments: the location of a firefox source directory, and the
 # location of an openssl source directory.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 import re
 import sys
diff --git a/scripts/codegen/makedesc.py b/scripts/codegen/makedesc.py
index efca4dda9acafe0403d5793e3f793a2d7ad0e429..7d8177f4695f901ca4b9867e026f08080ffb355e 100644
--- a/scripts/codegen/makedesc.py
+++ b/scripts/codegen/makedesc.py
@@ -9,6 +9,11 @@
 # I've used this to make inputs for unit tests.  I wouldn't suggest
 # using it for anything else.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import base64
 import binascii
 import ctypes
diff --git a/scripts/maint/add_c_file.py b/scripts/maint/add_c_file.py
index a773fd0fff4476fd846631035f9ac90ccde54267..a9a6eb25bd29e2a05ba61f01f8b7699775b5d114 100755
--- a/scripts/maint/add_c_file.py
+++ b/scripts/maint/add_c_file.py
@@ -9,6 +9,11 @@
    % add_c_file.py ./src/feature/dirauth/ocelot.c
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 import re
 import time
diff --git a/scripts/maint/annotate_ifdef_directives.py b/scripts/maint/annotate_ifdef_directives.py
index 102128bfa03583ab3d7a3fa67c072b426e0790a0..cd70b55c8c1725b7437778e15f965a8673d2fc65 100755
--- a/scripts/maint/annotate_ifdef_directives.py
+++ b/scripts/maint/annotate_ifdef_directives.py
@@ -57,6 +57,11 @@ Note that only #else and #endif lines are annotated.  Existing comments
 on those lines are removed.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import re
 
 # Any block with fewer than this many lines does not need annotations.
diff --git a/scripts/maint/checkIncludes.py b/scripts/maint/checkIncludes.py
index 926b201b3508c0f45867914e1979350a775ac3d3..2ca46347f08d8dafd571dd302930090c9af25aef 100755
--- a/scripts/maint/checkIncludes.py
+++ b/scripts/maint/checkIncludes.py
@@ -5,6 +5,11 @@
 # functionality.  This is a stub file that exists so that older git
 # hooks will know where to look.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys, os
 
 dirname = os.path.split(sys.argv[0])[0]
diff --git a/scripts/maint/format_changelog.py b/scripts/maint/format_changelog.py
index 97a6ce938b906118cc34964c880e1cba82c82a35..5f04a44ef67c76425fcbae733b06c328b58b45fc 100755
--- a/scripts/maint/format_changelog.py
+++ b/scripts/maint/format_changelog.py
@@ -9,7 +9,11 @@
 # To run it, pipe a section of the changelog (starting with "Changes
 # in Tor 0.x.y.z-alpha" through the script.)
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 import re
 import sys
diff --git a/scripts/maint/lintChanges.py b/scripts/maint/lintChanges.py
index 82c118f07e83f4d90b6dcb19150e846271e7212b..88a865a572c5848b306046e5007dd88c6fb92569 100755
--- a/scripts/maint/lintChanges.py
+++ b/scripts/maint/lintChanges.py
@@ -1,7 +1,10 @@
 #!/usr/bin/python
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
-from __future__ import with_statement
+from __future__ import unicode_literals
+
 import sys
 import re
 import os
diff --git a/scripts/maint/locatemissingdoxygen.py b/scripts/maint/locatemissingdoxygen.py
index 797bf8176f303bd5214376d4af348645f64113bb..9e58bd34777c9dfdee51424924dcad516c4a4222 100755
--- a/scripts/maint/locatemissingdoxygen.py
+++ b/scripts/maint/locatemissingdoxygen.py
@@ -7,6 +7,11 @@
   to highlight the undocumented stuff.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 import re
 import shutil
diff --git a/scripts/maint/practracker/includes.py b/scripts/maint/practracker/includes.py
index ed0e11ef28eb6deccb524615a8e97b096f73578e..fe0f32e25389000508800f81595dc02423132a8d 100755
--- a/scripts/maint/practracker/includes.py
+++ b/scripts/maint/practracker/includes.py
@@ -19,8 +19,10 @@
    Advisory .may_include files only result in warnings, rather than errors.
 """
 
-
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import fnmatch
 import os
diff --git a/scripts/maint/practracker/metrics.py b/scripts/maint/practracker/metrics.py
index 4c62bc242549630600f508ffc6278e35e03a472f..ae88b84f313b4d3036ae88e75109b99ad0a6a685 100644
--- a/scripts/maint/practracker/metrics.py
+++ b/scripts/maint/practracker/metrics.py
@@ -4,6 +4,11 @@
 # These are currently ad-hoc string operations and regexps.
 # We might want to use a proper static analysis library in the future, if we want to get more advanced metrics.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import re
 
 def get_file_len(f):
diff --git a/scripts/maint/practracker/practracker.py b/scripts/maint/practracker/practracker.py
index 5f26d28ceab582755351d338e2931c5d8f74b335..e1845c43e36b99048e509d1fe5e35d2fc00889d5 100755
--- a/scripts/maint/practracker/practracker.py
+++ b/scripts/maint/practracker/practracker.py
@@ -19,7 +19,10 @@ problems in the Tor source, use the --regen flag:
   $ python3 --regen ./scripts/maint/practracker/practracker.py .
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import os, sys
 
diff --git a/scripts/maint/practracker/practracker_tests.py b/scripts/maint/practracker/practracker_tests.py
index 45719d6cb76eec0a710ed7ca8642a0a1060625b2..8d0418880c41d5829a97c98ea8c16cdace9f7fc0 100755
--- a/scripts/maint/practracker/practracker_tests.py
+++ b/scripts/maint/practracker/practracker_tests.py
@@ -2,6 +2,11 @@
 
 """Some simple tests for practracker metrics"""
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import unittest
 
 try:
diff --git a/scripts/maint/practracker/problem.py b/scripts/maint/practracker/problem.py
index d21840a2136e390865c7f633a1e06bb65c0db845..bee5eeb903e62a1c1e424720a2b66ee323f9f226 100644
--- a/scripts/maint/practracker/problem.py
+++ b/scripts/maint/practracker/problem.py
@@ -7,7 +7,10 @@ problem is worse than a registered exception so that it only warns when things
 get worse.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import os.path
 import re
diff --git a/scripts/maint/practracker/util.py b/scripts/maint/practracker/util.py
index db02a983f82eede2975cf3e1b6a9793fe5e8baa6..c52ca2fbbfb6ecc2ddda0c96eb9ddb1bc62a2e5c 100644
--- a/scripts/maint/practracker/util.py
+++ b/scripts/maint/practracker/util.py
@@ -1,3 +1,8 @@
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 
 # We don't want to run metrics for unittests, automatically-generated C files,
diff --git a/scripts/maint/rectify_include_paths.py b/scripts/maint/rectify_include_paths.py
index 1140e8cd2278f9d478ac27b05bee04b0297548af..111cf816ce3a4c9a025f9716af528c1a5b9102d2 100755
--- a/scripts/maint/rectify_include_paths.py
+++ b/scripts/maint/rectify_include_paths.py
@@ -1,5 +1,10 @@
 #!/usr/bin/python
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import os
 import os.path
 import re
diff --git a/scripts/maint/redox.py b/scripts/maint/redox.py
index 203cce01071ebc809e07f5271ec863e89810a620..171c6d969975f279b21d55dd35647015e7cabc3b 100755
--- a/scripts/maint/redox.py
+++ b/scripts/maint/redox.py
@@ -29,6 +29,14 @@
 #     "mv fname.c.newdoc fname.c".  Otherwise, you'll need to merge
 #     the parts you like by hand.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
+import re
+import sys
+
 # Which files should we ignore warning from?  Mostly, these are external
 # files that we've snarfed in from somebody else, whose C we do no intend
 # to document for them.
@@ -52,9 +60,6 @@ ADD_DOCDOCS_TO_TYPES += [ 'variable', ]
 # ====================
 # The rest of this should not need hacking.
 
-import re
-import sys
-
 KINDS = [ "type", "field", "typedef", "define", "function", "variable",
           "enumeration" ]
 
diff --git a/scripts/maint/rename_c_identifier.py b/scripts/maint/rename_c_identifier.py
index 213172d9138fd7e696ac8c0b160cca6d7f7e27f6..6e0c1d8cf1b6f8300f054fe58e2cfd14b00bec63 100755
--- a/scripts/maint/rename_c_identifier.py
+++ b/scripts/maint/rename_c_identifier.py
@@ -11,6 +11,11 @@ Helpful script to replace one or more C identifiers, and optionally
 generate a commit message explaining what happened.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import argparse
 import fileinput
 import os
diff --git a/scripts/maint/sortChanges.py b/scripts/maint/sortChanges.py
index 44dd0dc41fa72a7d8595199c5ad48623e6382da9..2e049b1e535e49b0d901812f076b18f0a2a2fa33 100755
--- a/scripts/maint/sortChanges.py
+++ b/scripts/maint/sortChanges.py
@@ -7,7 +7,11 @@
    changelog.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
+
 import re
 import sys
 
diff --git a/scripts/maint/update_versions.py b/scripts/maint/update_versions.py
index 706a93b6a287788af78a7af25ebe53476ce7ba81..07de1c343a0b99630d3b1376e9627b914dae41ba 100755
--- a/scripts/maint/update_versions.py
+++ b/scripts/maint/update_versions.py
@@ -1,6 +1,9 @@
 #!/usr/bin/env python
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import io
 import os
diff --git a/scripts/test/appveyor-irc-notify.py b/scripts/test/appveyor-irc-notify.py
index cfe0afe7ae233ab71bab24045b9b0ee47679be4a..598a68f47d7bb89968dde678db36561f2e9f6cce 100644
--- a/scripts/test/appveyor-irc-notify.py
+++ b/scripts/test/appveyor-irc-notify.py
@@ -75,8 +75,10 @@ in Appveyor's YAML:
       - "python scripts/test/appveyor-irc-notify.py irc.oftc.net:6697 tor-ci failure
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
-from __future__ import absolute_import
+from __future__ import unicode_literals
 
 import os
 import random
diff --git a/src/config/mmdb-convert.py b/src/config/mmdb-convert.py
index b861e9433ece66ef93e1f3be89759496523db8b8..a58f5d43e131bf85afbe0c548eb441773af897b1 100644
--- a/src/config/mmdb-convert.py
+++ b/src/config/mmdb-convert.py
@@ -28,6 +28,11 @@
    pieces.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import struct
 import bisect
 import socket
diff --git a/src/test/bt_test.py b/src/test/bt_test.py
index f9ca79efde84802a242b3ec3377923f55fae89f5..d728f13596368668b21109cada122778a393607b 100755
--- a/src/test/bt_test.py
+++ b/src/test/bt_test.py
@@ -15,7 +15,11 @@ OK
 
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys
 
 
diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py
index 75562184b5b41bc2693db71001fc9a025b492abe..658f7cde12d0769bfde618baf8f0c9ac6e48fcdf 100644
--- a/src/test/ed25519_exts_ref.py
+++ b/src/test/ed25519_exts_ref.py
@@ -8,6 +8,11 @@
    Includes self-tester and test vector generator.
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import slow_ed25519
 from slow_ed25519 import *
 
diff --git a/src/test/hs_build_address.py b/src/test/hs_build_address.py
index 7ff22c3a9a963195cc4817342b16b4d278337e32..91864eabcbd6a8e902db1512faefdadabddca3d7 100644
--- a/src/test/hs_build_address.py
+++ b/src/test/hs_build_address.py
@@ -1,3 +1,8 @@
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys
 import hashlib
 import struct
diff --git a/src/test/hs_indexes.py b/src/test/hs_indexes.py
index af0b81f8ded0087779ce1da908f65a35ce71bc17..5c6d893a6624af640bee53807e77e21bf7bcc97f 100644
--- a/src/test/hs_indexes.py
+++ b/src/test/hs_indexes.py
@@ -7,6 +7,11 @@
 # store/fetch the descriptor on the hashring. (hs_build_hs_index()).
 #
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys
 import hashlib
 import struct
diff --git a/src/test/hs_ntor_ref.py b/src/test/hs_ntor_ref.py
index 1b9772a5d6755f7ac4f643b796fd72312bc4b656..f107cc36ca286d4918fe5877af48a41b4c1d3e05 100644
--- a/src/test/hs_ntor_ref.py
+++ b/src/test/hs_ntor_ref.py
@@ -41,6 +41,11 @@ The whole logic and concept for this test suite was taken from ntor_ref.py.
                 *** DO NOT USE THIS IN PRODUCTION. ***
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import struct
 import os, sys
 import binascii
diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py
index 3e642eb257e8f3927144c3f73fbf70f4efb0c83a..e3307430e1ad7702e1cbb20187ec10fa6154875a 100755
--- a/src/test/ntor_ref.py
+++ b/src/test/ntor_ref.py
@@ -27,6 +27,11 @@ commands:
 
 """
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import binascii
 try:
     import curve25519
diff --git a/src/test/ope_ref.py b/src/test/ope_ref.py
index b2f7012563ca628a6c9627d970c31b803f198ed2..61a86b57bb64a13a95ccf9a004a2b23c202cbbbe 100644
--- a/src/test/ope_ref.py
+++ b/src/test/ope_ref.py
@@ -4,6 +4,11 @@
 # Reference implementation for our rudimentary OPE code, used to
 # generate test vectors. See crypto_ope.c for more details.
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
 from cryptography.hazmat.primitives.ciphers.algorithms import AES
 from cryptography.hazmat.backends import default_backend
diff --git a/src/test/slow_ed25519.py b/src/test/slow_ed25519.py
index f44708b20073fe90c628aa180f1705a31d691ec9..afad6780004aa41957d1494453a0f105663734f1 100644
--- a/src/test/slow_ed25519.py
+++ b/src/test/slow_ed25519.py
@@ -8,6 +8,11 @@
 #
 # Don't edit this file.  Mess with ed25519_ref.py
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import hashlib
 
 b = 256
diff --git a/src/test/slownacl_curve25519.py b/src/test/slownacl_curve25519.py
index 4dabab61b6dcd56a12f8634ade7d431aab578a65..0cafe0e71f7179c65f89a7f764c1864d6a463da0 100644
--- a/src/test/slownacl_curve25519.py
+++ b/src/test/slownacl_curve25519.py
@@ -6,10 +6,15 @@
 # Nick got the slownacl source from:
 #        https://github.com/mdempsky/dnscurve/tree/master/slownacl
 
-__all__ = ['smult_curve25519_base', 'smult_curve25519']
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
 
 import sys
 
+__all__ = ['smult_curve25519_base', 'smult_curve25519']
+
 P = 2 ** 255 - 19
 A = 486662
 
diff --git a/src/test/sr_commit_calc_ref.py b/src/test/sr_commit_calc_ref.py
index 45e629cfb0e74251c9aff2c65c31dcc0767722f0..c4cb72d87fd721fd50ea0fe961d94055d73ee4c5 100644
--- a/src/test/sr_commit_calc_ref.py
+++ b/src/test/sr_commit_calc_ref.py
@@ -12,6 +12,11 @@
 #      COMMIT = base64-encode( TIMESTAMP || H(REVEAL) )
 #
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys
 import hashlib
 import struct
diff --git a/src/test/sr_srv_calc_ref.py b/src/test/sr_srv_calc_ref.py
index 492ca62b15e24dea53c7d38d7bf71f9a6ba85c3f..a3752b15cc9cc7f4869cc28a197270fd66dc4274 100644
--- a/src/test/sr_srv_calc_ref.py
+++ b/src/test/sr_srv_calc_ref.py
@@ -10,6 +10,11 @@
 #                     HASHED_REVEALS | previous_SRV)
 #
 
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import sys
 import hashlib
 import struct
diff --git a/src/test/test_rebind.py b/src/test/test_rebind.py
index c9b9200b2d2a4080816453d299fd526d097b2c06..3fc3deb68e3aa5cddb4bf02591d8fd019e6400a8 100644
--- a/src/test/test_rebind.py
+++ b/src/test/test_rebind.py
@@ -1,4 +1,7 @@
+# Future imports for Python 2.7, mandatory in 3.0
+from __future__ import division
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import errno
 import logging