diff --git a/reviewboard/admin/__init__.py b/reviewboard/admin/__init__.py
index f1fffc842c388896ff6680e67f85c65c761a2c1e..8c55d2f1d24af39e7dc1a84abf053d8af0506f5c 100644
--- a/reviewboard/admin/__init__.py
+++ b/reviewboard/admin/__init__.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.db.models.signals import post_save, post_delete
 
 from reviewboard.admin.signals import _delete_widget_cache
diff --git a/reviewboard/admin/cache_stats.py b/reviewboard/admin/cache_stats.py
index e7434e6572eeccfb482b3de4f6c647895bf7eb97..401bf860bf8e6c30f20764330c912d50821603c4 100644
--- a/reviewboard/admin/cache_stats.py
+++ b/reviewboard/admin/cache_stats.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import logging
 import socket
 
@@ -64,8 +66,8 @@ def get_cache_stats():
             s.close()
             continue
 
-        s.send("stats\r\n")
-        data = s.recv(2048)
+        s.send(b"stats\r\n")
+        data = s.recv(2048).decode('ascii')
         s.close()
 
         stats = {}
diff --git a/reviewboard/admin/checks.py b/reviewboard/admin/checks.py
index 9d6c955204c8c479e3dc7ffbd63369c46b7ba35b..8dde157cebc36896cabe68cb43e07a002e51e524 100644
--- a/reviewboard/admin/checks.py
+++ b/reviewboard/admin/checks.py
@@ -27,6 +27,7 @@
 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #
 
+from __future__ import unicode_literals
 
 import getpass
 import imp
diff --git a/reviewboard/admin/context_processors.py b/reviewboard/admin/context_processors.py
index 5aca320885601999a44309585e2363d1004c12b0..ab6365bdf46a2b6e521fca92d707c15d78a77d4b 100644
--- a/reviewboard/admin/context_processors.py
+++ b/reviewboard/admin/context_processors.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from reviewboard import get_version_string, get_package_version, is_release
 
 
diff --git a/reviewboard/admin/forms.py b/reviewboard/admin/forms.py
index 73153e67e1b7fdb64714aea39346689d9c2f1f1f..4954c6c7a1c5c0712eca36df8ff637d53f092da7 100644
--- a/reviewboard/admin/forms.py
+++ b/reviewboard/admin/forms.py
@@ -24,6 +24,7 @@
 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #
 
+from __future__ import unicode_literals
 
 import logging
 import os
diff --git a/reviewboard/admin/management/__init__.py b/reviewboard/admin/management/__init__.py
index 16fdb74779a912bb46b8bdec7d71f6d9285900ab..5737ee084950ed6d3619fb51df23be0b07b26afd 100644
--- a/reviewboard/admin/management/__init__.py
+++ b/reviewboard/admin/management/__init__.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.db.models import signals
 
 from reviewboard.admin.management.evolutions import init_evolutions
diff --git a/reviewboard/admin/management/commands/dumpdb.py b/reviewboard/admin/management/commands/dumpdb.py
index 1aa1bad89d4c39755636218afcc7507bea1d330a..41d328ecdfd5a797a97784ba098b68dfc7930886 100644
--- a/reviewboard/admin/management/commands/dumpdb.py
+++ b/reviewboard/admin/management/commands/dumpdb.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.core import serializers
 from django.core.management.base import CommandError, NoArgsCommand
 from django.db.models import get_apps, get_models
diff --git a/reviewboard/admin/management/commands/loaddb.py b/reviewboard/admin/management/commands/loaddb.py
index 3ec53ab8fef99e9ec3e215ff15d23de64540963a..e548fc1e641a1df03fc38fb68f0e32bd0979f786 100644
--- a/reviewboard/admin/management/commands/loaddb.py
+++ b/reviewboard/admin/management/commands/loaddb.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import os
 import re
 
@@ -6,6 +8,7 @@ from django.core import serializers
 from django.core.management.base import BaseCommand, CommandError
 from django.db import transaction
 from django.db.models import get_apps
+from djblets.util.compat import six
 from djblets.util.compat.six.moves import input
 
 
@@ -90,8 +93,7 @@ Type 'yes' to continue, or 'no' to cancel: """)
             transaction.commit()
             transaction.leave_transaction_management()
         except Exception as e:
-            raise CommandError("Problem installing '%s': %s\n" %
-                               (filename, str(e)))
+            raise CommandError("Problem installing '%s': %s\n" % (filename, e))
 
             if transaction_setup:
                 transaction.rollback()
diff --git a/reviewboard/admin/management/commands/resolve-check.py b/reviewboard/admin/management/commands/resolve-check.py
index 66e81e9ad62427f6deb49997da07ecfe20c95281..cafda0f4c15402349fc42901c669db1108aa0c12 100644
--- a/reviewboard/admin/management/commands/resolve-check.py
+++ b/reviewboard/admin/management/commands/resolve-check.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import sys
 
 from django.core.management.base import BaseCommand, CommandError
diff --git a/reviewboard/admin/management/evolutions.py b/reviewboard/admin/management/evolutions.py
index da0ab2e6c15cc3b66f531ab07f0b7908d14bb546..b41e13731c9710db9cfb9e32e779782285d51531 100644
--- a/reviewboard/admin/management/evolutions.py
+++ b/reviewboard/admin/management/evolutions.py
@@ -1,5 +1,6 @@
-from django.core.management.commands import loaddata
+from __future__ import unicode_literals
 
+from django.core.management.commands import loaddata
 from django_evolution import models as django_evolution
 
 from reviewboard.diffviewer.models import FileDiff
diff --git a/reviewboard/admin/management/sites.py b/reviewboard/admin/management/sites.py
index c644ec27b16ff7abed508e99cd542268cc28a1df..c7a3ee883e5c6fd4f90f095a09ac4ca51a86e4c1 100644
--- a/reviewboard/admin/management/sites.py
+++ b/reviewboard/admin/management/sites.py
@@ -1,4 +1,4 @@
-from __future__ import print_function
+from __future__ import print_function, unicode_literals
 
 from django.conf import settings
 from django.contrib.sites.models import Site
diff --git a/reviewboard/admin/middleware.py b/reviewboard/admin/middleware.py
index cbcf0779abfac825b4ef26b404224ee9d2f185e0..6ff636382784d662ce3eaf2a15cc20fdd3962a27 100644
--- a/reviewboard/admin/middleware.py
+++ b/reviewboard/admin/middleware.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import logging
 import os
 
diff --git a/reviewboard/admin/signals.py b/reviewboard/admin/signals.py
index 04edc41ad2c267cb76b602b869f9a7003e5892b2..0f3df4870982dd6b26d30377d5feb8c643757a85 100644
--- a/reviewboard/admin/signals.py
+++ b/reviewboard/admin/signals.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from reviewboard.admin.widgets import increment_sync_num
 
 
diff --git a/reviewboard/admin/siteconfig.py b/reviewboard/admin/siteconfig.py
index 8da081d52bef658122ad2f0f846e3d457018bbd4..baa9cb258b1cc904af5da9737dd06c9933e38664 100644
--- a/reviewboard/admin/siteconfig.py
+++ b/reviewboard/admin/siteconfig.py
@@ -29,6 +29,7 @@
 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #
 
+from __future__ import unicode_literals
 
 import os.path
 
@@ -271,9 +272,9 @@ def load_site_config():
 
     # These blow up if they're not the perfectly right types
     settings.AWS_QUERYSTRING_AUTH = siteconfig.get('aws_querystring_auth')
-    settings.AWS_ACCESS_KEY_ID = str(siteconfig.get('aws_access_key_id'))
-    settings.AWS_SECRET_ACCESS_KEY = str(siteconfig.get('aws_secret_access_key'))
-    settings.AWS_STORAGE_BUCKET_NAME = str(siteconfig.get('aws_s3_bucket_name'))
+    settings.AWS_ACCESS_KEY_ID = six.text_type(siteconfig.get('aws_access_key_id'))
+    settings.AWS_SECRET_ACCESS_KEY = six.text_type(siteconfig.get('aws_secret_access_key'))
+    settings.AWS_STORAGE_BUCKET_NAME = six.text_type(siteconfig.get('aws_s3_bucket_name'))
     try:
         settings.AWS_CALLING_FORMAT = int(siteconfig.get('aws_calling_format'))
     except ValueError:
diff --git a/reviewboard/admin/support.py b/reviewboard/admin/support.py
index ec61f96258bd891971d7f4943c5b8f9a855bfa35..974a6d6518c58e377f258f83d5fafb99082c701d 100644
--- a/reviewboard/admin/support.py
+++ b/reviewboard/admin/support.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import base64
 import time
 from datetime import datetime
@@ -24,13 +26,13 @@ def get_support_url(request):
     if not support_url:
         support_data = base64.b64encode('\t'.join([
             get_install_key(),
-            str(int(request.user.is_staff)),
+            '%d' % int(request.user.is_staff),
             siteconfig.site.domain,
             siteconfig.get('site_admin_name'),
             siteconfig.get('site_admin_email'),
             get_package_version(),
-            str(User.objects.filter(is_active=True).count()),
-            str(int(time.mktime(datetime.now().timetuple()))),
+            '%d' % User.objects.filter(is_active=True).count(),
+            '%d' % int(time.mktime(datetime.now().timetuple())),
         ]))
 
         support_url = settings.DEFAULT_SUPPORT_URL % {
diff --git a/reviewboard/admin/templatetags/rbadmintags.py b/reviewboard/admin/templatetags/rbadmintags.py
index 714941f77cce0bf29d69c8dac4d59f548b9c0bbc..e503e59caa02c2260e94f0ab382605229d2d1a75 100644
--- a/reviewboard/admin/templatetags/rbadmintags.py
+++ b/reviewboard/admin/templatetags/rbadmintags.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import template
 from django.contrib.sites.models import Site
 from django.contrib.auth.models import User
diff --git a/reviewboard/admin/tests.py b/reviewboard/admin/tests.py
index ed01ef676fb71043b355813297cb1cbafd479736..183d9b941267b10201f1bd69d06b9e11b50d6b4e 100644
--- a/reviewboard/admin/tests.py
+++ b/reviewboard/admin/tests.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import os
 import shutil
 import tempfile
diff --git a/reviewboard/admin/urls.py b/reviewboard/admin/urls.py
index 1afa69d23876cb2877845baad56324ce93f2487e..0ce988aaa3d58f402df2145ecf13088d9c684cb9 100644
--- a/reviewboard/admin/urls.py
+++ b/reviewboard/admin/urls.py
@@ -24,6 +24,7 @@
 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #
 
+from __future__ import unicode_literals
 
 from django.conf.urls import include, patterns, url
 from django.contrib import admin
diff --git a/reviewboard/admin/validation.py b/reviewboard/admin/validation.py
index acf84a591821f0455456d9cacd86bf2bf5a8cd38..5859a31a35694f27291219a9bf54a2717f6de3ef 100644
--- a/reviewboard/admin/validation.py
+++ b/reviewboard/admin/validation.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext as _
 
diff --git a/reviewboard/admin/views.py b/reviewboard/admin/views.py
index 0e36a50a41099d25820fea0b1612fc6f7bd7804c..7480e917733ca23316b693b977d500600e59847b 100644
--- a/reviewboard/admin/views.py
+++ b/reviewboard/admin/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import json
 import logging
 
diff --git a/reviewboard/admin/widgets.py b/reviewboard/admin/widgets.py
index 2df6fc7824b6e273850c852e73f7b58d2c0e2525..3c26400d9f9e3c4aa0850247cd4fdb8e9c8cab80 100644
--- a/reviewboard/admin/widgets.py
+++ b/reviewboard/admin/widgets.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import datetime
 import re
 import time
@@ -8,6 +10,7 @@ from django.db.models.aggregates import Count
 from django.template.context import RequestContext
 from django.template.loader import render_to_string
 from django.utils.translation import ugettext as _
+from djblets.util.compat import six
 from djblets.util.misc import cache_memoize
 
 from reviewboard.admin.cache_stats import get_cache_stats
@@ -22,7 +25,7 @@ from reviewboard.scmtools.models import Repository
 
 DAYS_TOTAL = 30  # Set the number of days to display in date browsing widgets
 
-NAME_TRANSFORM_RE = re.compile('([A-Z])')
+NAME_TRANSFORM_RE = re.compile(r'([A-Z])')
 
 primary_widgets = []
 secondary_widgets = []
@@ -92,8 +95,10 @@ class Widget(object):
         be overridden to include that data in the key.
         """
         syncnum = get_sync_num()
-        key = "w-%s-%s-%s-%s" % (self.name, str(datetime.date.today()),
-                                 request.user.username, str(syncnum))
+        key = "w-%s-%s-%s-%s" % (self.name,
+                                 datetime.date.today(),
+                                 request.user.username,
+                                 syncnum)
         return key
 
 
@@ -120,7 +125,7 @@ class UserActivityWidget(Widget):
     Displays a pie chart of the active application users based on their last
     login dates.
     """
-    title = 'User Activity'
+    title = _('User Activity')
     size = Widget.LARGE
     template = 'admin/widgets/w-user-activity.html'
     actions = [
@@ -166,7 +171,7 @@ class ReviewRequestStatusesWidget(Widget):
 
     Displays a pie chart showing review request by status.
     """
-    title = 'Request Statuses'
+    title = _('Request Statuses')
     template = 'admin/widgets/w-request-statuses.html'
 
     def generate_data(self, request):
@@ -187,7 +192,7 @@ class RepositoriesWidget(Widget):
     """
     MAX_REPOSITORIES = 3
 
-    title = 'Repositories'
+    title = _('Repositories')
     size = Widget.LARGE
     template = 'admin/widgets/w-repositories.html'
     actions = [
@@ -211,8 +216,10 @@ class RepositoriesWidget(Widget):
 
     def generate_cache_key(self, request):
         syncnum = get_sync_num()
-        key = "w-%s-%s-%s-%s" % (self.name, str(datetime.date.today()),
-                                 request.user.username, str(syncnum))
+        key = "w-%s-%s-%s-%s" % (self.name,
+                                 datetime.date.today(),
+                                 request.user.username,
+                                 syncnum)
         return key
 
 
@@ -223,7 +230,7 @@ class ReviewGroupsWidget(Widget):
     """
     MAX_GROUPS = 5
 
-    title = 'Review Groups'
+    title = _('Review Groups')
     template = 'admin/widgets/w-groups.html'
     actions = [
         {
@@ -248,7 +255,7 @@ class ServerCacheWidget(Widget):
 
     Displays a list of memcached statistics, if available.
     """
-    title = 'Server Cache'
+    title = _('Server Cache')
     template = 'admin/widgets/w-server-cache.html'
     cache_data = False
 
@@ -279,7 +286,7 @@ class NewsWidget(Widget):
 
     Displays the latest news headlines from reviewboard.org.
     """
-    title = 'Review Board News'
+    title = _('Review Board News')
     template = 'admin/widgets/w-news.html'
     actions = [
         {
@@ -299,7 +306,7 @@ class DatabaseStatsWidget(Widget):
 
     Displays a list of totals for several important database tables.
     """
-    title = 'Database Stats'
+    title = _('Database Stats')
     template = 'admin/widgets/w-stats.html'
 
     def generate_data(self, request):
@@ -318,7 +325,7 @@ class RecentActionsWidget(Widget):
 
     Displays a list of recent admin actions to the user.
     """
-    title = 'Recent Actions'
+    title = _('Recent Actions')
     template = 'admin/widgets/w-recent-actions.html'
     has_data = False
 
@@ -384,8 +391,9 @@ def dynamic_activity_data(request):
 
             for obj in q:
                 data.append([
-                    time.mktime(time.strptime(str(obj[timestampField]),
-                                              "%Y-%m-%d")) * 1000,
+                    time.mktime(time.strptime(
+                        six.text_type(obj[timestampField]),
+                        "%Y-%m-%d")) * 1000,
                     obj['created_count']
                 ])
 
@@ -422,7 +430,7 @@ class ActivityGraphWidget(Widget):
     All displayed widget data is computed on demand, rather than up-front
     during creation of the widget.
     """
-    title = 'Review Board Activity'
+    title = _('Review Board Activity')
     size = Widget.LARGE
     template = 'admin/widgets/w-stats-large.html'
     actions = [
