diff --git a/setup.cfg b/setup.cfg
index 450525f9a..c4744ae58 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -4,3 +4,5 @@ universal = 1
[isort]
line_length=100
multi_line_output=4
+skip=migrations
+add_imports=from __future__ import absolute_import,from __future__ import unicode_literals
diff --git a/wagtail/api/apps.py b/wagtail/api/apps.py
index 4b941a0e7..26b70cc5c 100644
--- a/wagtail/api/apps.py
+++ b/wagtail/api/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig, apps
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
diff --git a/wagtail/api/v2/endpoints.py b/wagtail/api/v2/endpoints.py
index f91c73911..04b6b7450 100644
--- a/wagtail/api/v2/endpoints.py
+++ b/wagtail/api/v2/endpoints.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from collections import OrderedDict
diff --git a/wagtail/api/v2/filters.py b/wagtail/api/v2/filters.py
index c03cd08cc..b5445397e 100644
--- a/wagtail/api/v2/filters.py
+++ b/wagtail/api/v2/filters.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from rest_framework.filters import BaseFilterBackend
from taggit.managers import _TaggableManager
diff --git a/wagtail/api/v2/pagination.py b/wagtail/api/v2/pagination.py
index ee6ae24f6..8dfd3b573 100644
--- a/wagtail/api/v2/pagination.py
+++ b/wagtail/api/v2/pagination.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from collections import OrderedDict
from django.conf import settings
diff --git a/wagtail/api/v2/router.py b/wagtail/api/v2/router.py
index 70fc7194e..97708ba54 100644
--- a/wagtail/api/v2/router.py
+++ b/wagtail/api/v2/router.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import functools
from django.conf.urls import include, url
diff --git a/wagtail/api/v2/serializers.py b/wagtail/api/v2/serializers.py
index 105c19ece..b20d0cd33 100644
--- a/wagtail/api/v2/serializers.py
+++ b/wagtail/api/v2/serializers.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from collections import OrderedDict
@@ -393,7 +393,7 @@ def get_serializer_class(model_, fields_, meta_fields=None, base=BaseSerializer)
model = model_
fields = base.default_fields + list(fields_)
- return type(model_.__name__ + 'Serializer', (base, ), {
+ return type(str(model_.__name__ + 'Serializer'), (base, ), {
'Meta': Meta,
'meta_fields': base.meta_fields + list(meta_fields or []),
})
diff --git a/wagtail/api/v2/signal_handlers.py b/wagtail/api/v2/signal_handlers.py
index 9b204afc0..c57bc44ea 100644
--- a/wagtail/api/v2/signal_handlers.py
+++ b/wagtail/api/v2/signal_handlers.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.db.models.signals import post_delete, post_save
diff --git a/wagtail/api/v2/tests/test_documents.py b/wagtail/api/v2/tests/test_documents.py
index 324288123..b745c7702 100644
--- a/wagtail/api/v2/tests/test_documents.py
+++ b/wagtail/api/v2/tests/test_documents.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/api/v2/tests/test_images.py b/wagtail/api/v2/tests/test_images.py
index 941310821..750934a90 100644
--- a/wagtail/api/v2/tests/test_images.py
+++ b/wagtail/api/v2/tests/test_images.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/api/v2/tests/test_pages.py b/wagtail/api/v2/tests/test_pages.py
index 92685e97d..092c38ff5 100644
--- a/wagtail/api/v2/tests/test_pages.py
+++ b/wagtail/api/v2/tests/test_pages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import collections
import json
diff --git a/wagtail/api/v2/urls.py b/wagtail/api/v2/urls.py
index 90c554333..2207f3b95 100644
--- a/wagtail/api/v2/urls.py
+++ b/wagtail/api/v2/urls.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from django.conf.urls import url
diff --git a/wagtail/api/v2/utils.py b/wagtail/api/v2/utils.py
index 3d2fc3d93..9e5345ac3 100644
--- a/wagtail/api/v2/utils.py
+++ b/wagtail/api/v2/utils.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.utils.six.moves.urllib.parse import urlparse
diff --git a/wagtail/bin/wagtail.py b/wagtail/bin/wagtail.py
index 830c1fab6..b44c2dcef 100644
--- a/wagtail/bin/wagtail.py
+++ b/wagtail/bin/wagtail.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-from __future__ import absolute_import, print_function
+from __future__ import absolute_import, print_function, unicode_literals
import os
from optparse import OptionParser
diff --git a/wagtail/contrib/settings/apps.py b/wagtail/contrib/settings/apps.py
index f907279ff..c0fc32bd1 100644
--- a/wagtail/contrib/settings/apps.py
+++ b/wagtail/contrib/settings/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/settings/context_processors.py b/wagtail/contrib/settings/context_processors.py
index 26d7be661..70cd4a475 100644
--- a/wagtail/contrib/settings/context_processors.py
+++ b/wagtail/contrib/settings/context_processors.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.utils.encoding import python_2_unicode_compatible
from .registry import registry
diff --git a/wagtail/contrib/settings/models.py b/wagtail/contrib/settings/models.py
index 3d7b0f291..ce44cf3eb 100644
--- a/wagtail/contrib/settings/models.py
+++ b/wagtail/contrib/settings/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.db import models
from .registry import register_setting
diff --git a/wagtail/contrib/settings/permissions.py b/wagtail/contrib/settings/permissions.py
index 227dd5be7..306698193 100644
--- a/wagtail/contrib/settings/permissions.py
+++ b/wagtail/contrib/settings/permissions.py
@@ -1,3 +1,6 @@
+from __future__ import absolute_import, unicode_literals
+
+
def user_can_edit_setting_type(user, model):
""" Check if a user has permission to edit this setting type """
return user.has_perm("{}.change_{}".format(
diff --git a/wagtail/contrib/settings/registry.py b/wagtail/contrib/settings/registry.py
index 5d52481a6..7ce9ea0a0 100644
--- a/wagtail/contrib/settings/registry.py
+++ b/wagtail/contrib/settings/registry.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import apps
from django.contrib.auth.models import Permission
from django.core.urlresolvers import reverse
diff --git a/wagtail/contrib/settings/templatetags/wagtailsettings_tags.py b/wagtail/contrib/settings/templatetags/wagtailsettings_tags.py
index a22f31f10..d34443c4f 100644
--- a/wagtail/contrib/settings/templatetags/wagtailsettings_tags.py
+++ b/wagtail/contrib/settings/templatetags/wagtailsettings_tags.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.template import Library
from wagtail.wagtailcore.models import Site
diff --git a/wagtail/contrib/settings/tests/test_register.py b/wagtail/contrib/settings/tests/test_register.py
index e817b40ff..761f9b14d 100644
--- a/wagtail/contrib/settings/tests/test_register.py
+++ b/wagtail/contrib/settings/tests/test_register.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/contrib/settings/tests/test_templates.py b/wagtail/contrib/settings/tests/test_templates.py
index 3f8f5a1d5..d3a36c74e 100644
--- a/wagtail/contrib/settings/tests/test_templates.py
+++ b/wagtail/contrib/settings/tests/test_templates.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.template import Context, RequestContext, Template
from django.test import TestCase
diff --git a/wagtail/contrib/settings/urls.py b/wagtail/contrib/settings/urls.py
index 555627c1d..aa834781f 100644
--- a/wagtail/contrib/settings/urls.py
+++ b/wagtail/contrib/settings/urls.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/wagtail/contrib/settings/views.py b/wagtail/contrib/settings/views.py
index 418a31834..a6a9c33d0 100644
--- a/wagtail/contrib/settings/views.py
+++ b/wagtail/contrib/settings/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render
diff --git a/wagtail/contrib/settings/wagtail_hooks.py b/wagtail/contrib/settings/wagtail_hooks.py
index 6ed8ab549..dae441bdc 100644
--- a/wagtail/contrib/settings/wagtail_hooks.py
+++ b/wagtail/contrib/settings/wagtail_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import include, url
from wagtail.wagtailcore import hooks
diff --git a/wagtail/contrib/wagtailapi/apps.py b/wagtail/contrib/wagtailapi/apps.py
index 530c663f3..03415268c 100644
--- a/wagtail/contrib/wagtailapi/apps.py
+++ b/wagtail/contrib/wagtailapi/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig, apps
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
diff --git a/wagtail/contrib/wagtailapi/endpoints.py b/wagtail/contrib/wagtailapi/endpoints.py
index d2d00f538..5d0afa9b7 100644
--- a/wagtail/contrib/wagtailapi/endpoints.py
+++ b/wagtail/contrib/wagtailapi/endpoints.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from collections import OrderedDict
diff --git a/wagtail/contrib/wagtailapi/filters.py b/wagtail/contrib/wagtailapi/filters.py
index 98ad1fc22..da377f0a5 100644
--- a/wagtail/contrib/wagtailapi/filters.py
+++ b/wagtail/contrib/wagtailapi/filters.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from rest_framework.filters import BaseFilterBackend
from taggit.managers import _TaggableManager
diff --git a/wagtail/contrib/wagtailapi/pagination.py b/wagtail/contrib/wagtailapi/pagination.py
index 8204158c8..d30e61e04 100644
--- a/wagtail/contrib/wagtailapi/pagination.py
+++ b/wagtail/contrib/wagtailapi/pagination.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from collections import OrderedDict
from django.conf import settings
diff --git a/wagtail/contrib/wagtailapi/router.py b/wagtail/contrib/wagtailapi/router.py
index 70fc7194e..97708ba54 100644
--- a/wagtail/contrib/wagtailapi/router.py
+++ b/wagtail/contrib/wagtailapi/router.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import functools
from django.conf.urls import include, url
diff --git a/wagtail/contrib/wagtailapi/serializers.py b/wagtail/contrib/wagtailapi/serializers.py
index 6fe65e2f0..f444874ec 100644
--- a/wagtail/contrib/wagtailapi/serializers.py
+++ b/wagtail/contrib/wagtailapi/serializers.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from collections import OrderedDict
@@ -284,6 +284,6 @@ def get_serializer_class(model_, fields_, base=BaseSerializer):
model = model_
fields = fields_
- return type(model_.__name__ + 'Serializer', (base, ), {
+ return type(str(model_.__name__ + 'Serializer'), (base, ), {
'Meta': Meta
})
diff --git a/wagtail/contrib/wagtailapi/signal_handlers.py b/wagtail/contrib/wagtailapi/signal_handlers.py
index 376da9231..4962bf2a2 100644
--- a/wagtail/contrib/wagtailapi/signal_handlers.py
+++ b/wagtail/contrib/wagtailapi/signal_handlers.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.db.models.signals import post_delete, post_save
diff --git a/wagtail/contrib/wagtailapi/tests/test_documents.py b/wagtail/contrib/wagtailapi/tests/test_documents.py
index 42b3438f2..49c4b7ffc 100644
--- a/wagtail/contrib/wagtailapi/tests/test_documents.py
+++ b/wagtail/contrib/wagtailapi/tests/test_documents.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/contrib/wagtailapi/tests/test_images.py b/wagtail/contrib/wagtailapi/tests/test_images.py
index 84e693cf4..c8cb0eeea 100644
--- a/wagtail/contrib/wagtailapi/tests/test_images.py
+++ b/wagtail/contrib/wagtailapi/tests/test_images.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/contrib/wagtailapi/tests/test_pages.py b/wagtail/contrib/wagtailapi/tests/test_pages.py
index 8ee080510..dfa240b84 100644
--- a/wagtail/contrib/wagtailapi/tests/test_pages.py
+++ b/wagtail/contrib/wagtailapi/tests/test_pages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import collections
import json
diff --git a/wagtail/contrib/wagtailapi/urls.py b/wagtail/contrib/wagtailapi/urls.py
index 878f05b31..17dd8db89 100644
--- a/wagtail/contrib/wagtailapi/urls.py
+++ b/wagtail/contrib/wagtailapi/urls.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
from django.conf.urls import url
diff --git a/wagtail/contrib/wagtailapi/utils.py b/wagtail/contrib/wagtailapi/utils.py
index 629b1dc64..22993b545 100644
--- a/wagtail/contrib/wagtailapi/utils.py
+++ b/wagtail/contrib/wagtailapi/utils.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.utils.six.moves.urllib.parse import urlparse
diff --git a/wagtail/contrib/wagtailfrontendcache/apps.py b/wagtail/contrib/wagtailfrontendcache/apps.py
index fe603cd2c..8fb19c8cf 100644
--- a/wagtail/contrib/wagtailfrontendcache/apps.py
+++ b/wagtail/contrib/wagtailfrontendcache/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
from wagtail.contrib.wagtailfrontendcache.signal_handlers import register_signal_handlers
diff --git a/wagtail/contrib/wagtailfrontendcache/backends.py b/wagtail/contrib/wagtailfrontendcache/backends.py
index 0c4517a85..f841a6223 100644
--- a/wagtail/contrib/wagtailfrontendcache/backends.py
+++ b/wagtail/contrib/wagtailfrontendcache/backends.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import json
import logging
diff --git a/wagtail/contrib/wagtailfrontendcache/signal_handlers.py b/wagtail/contrib/wagtailfrontendcache/signal_handlers.py
index ae81d85b1..33cfe77c7 100644
--- a/wagtail/contrib/wagtailfrontendcache/signal_handlers.py
+++ b/wagtail/contrib/wagtailfrontendcache/signal_handlers.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import apps
from wagtail.contrib.wagtailfrontendcache.utils import purge_page_from_cache
diff --git a/wagtail/contrib/wagtailfrontendcache/tests.py b/wagtail/contrib/wagtailfrontendcache/tests.py
index f67a6854a..69d01f2dd 100644
--- a/wagtail/contrib/wagtailfrontendcache/tests.py
+++ b/wagtail/contrib/wagtailfrontendcache/tests.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.test import TestCase
from django.test.utils import override_settings
diff --git a/wagtail/contrib/wagtailfrontendcache/utils.py b/wagtail/contrib/wagtailfrontendcache/utils.py
index f4d8e0b96..af0e9f883 100644
--- a/wagtail/contrib/wagtailfrontendcache/utils.py
+++ b/wagtail/contrib/wagtailfrontendcache/utils.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import logging
from django.conf import settings
diff --git a/wagtail/contrib/wagtailmedusa/apps.py b/wagtail/contrib/wagtailmedusa/apps.py
index 46143d137..98a6e46ad 100644
--- a/wagtail/contrib/wagtailmedusa/apps.py
+++ b/wagtail/contrib/wagtailmedusa/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/wagtailmedusa/renderers.py b/wagtail/contrib/wagtailmedusa/renderers.py
index 950e13a14..552b793e0 100644
--- a/wagtail/contrib/wagtailmedusa/renderers.py
+++ b/wagtail/contrib/wagtailmedusa/renderers.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django_medusa.renderers import StaticSiteRenderer
from wagtail.wagtailcore.models import Site
from wagtail.wagtaildocs.models import Document
diff --git a/wagtail/contrib/wagtailroutablepage/apps.py b/wagtail/contrib/wagtailroutablepage/apps.py
index c3b9c9573..e42806299 100644
--- a/wagtail/contrib/wagtailroutablepage/apps.py
+++ b/wagtail/contrib/wagtailroutablepage/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/wagtailroutablepage/models.py b/wagtail/contrib/wagtailroutablepage/models.py
index fb8b74ad3..90a1c287b 100644
--- a/wagtail/contrib/wagtailroutablepage/models.py
+++ b/wagtail/contrib/wagtailroutablepage/models.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.conf.urls import url
from django.core.urlresolvers import RegexURLResolver
diff --git a/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py b/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py
index b57227fc6..3834f4e38 100644
--- a/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py
+++ b/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import template
register = template.Library()
diff --git a/wagtail/contrib/wagtailroutablepage/tests.py b/wagtail/contrib/wagtailroutablepage/tests.py
index 2d4dccd2d..cf3c33370 100644
--- a/wagtail/contrib/wagtailroutablepage/tests.py
+++ b/wagtail/contrib/wagtailroutablepage/tests.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import NoReverseMatch
from django.test import RequestFactory, TestCase
diff --git a/wagtail/contrib/wagtailsearchpromotions/admin_urls.py b/wagtail/contrib/wagtailsearchpromotions/admin_urls.py
index de7436c45..03bab11c9 100644
--- a/wagtail/contrib/wagtailsearchpromotions/admin_urls.py
+++ b/wagtail/contrib/wagtailsearchpromotions/admin_urls.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from wagtail.contrib.wagtailsearchpromotions import views
diff --git a/wagtail/contrib/wagtailsearchpromotions/apps.py b/wagtail/contrib/wagtailsearchpromotions/apps.py
index 586ba34b8..0118d6638 100644
--- a/wagtail/contrib/wagtailsearchpromotions/apps.py
+++ b/wagtail/contrib/wagtailsearchpromotions/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/wagtailsearchpromotions/forms.py b/wagtail/contrib/wagtailsearchpromotions/forms.py
index b797ee474..6802d7a3f 100644
--- a/wagtail/contrib/wagtailsearchpromotions/forms.py
+++ b/wagtail/contrib/wagtailsearchpromotions/forms.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import forms
from django.forms.models import inlineformset_factory
from django.utils.translation import ugettext_lazy as _
diff --git a/wagtail/contrib/wagtailsearchpromotions/models.py b/wagtail/contrib/wagtailsearchpromotions/models.py
index a7e65e14d..4e2f17ebc 100644
--- a/wagtail/contrib/wagtailsearchpromotions/models.py
+++ b/wagtail/contrib/wagtailsearchpromotions/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.db import models
from django.utils.translation import ugettext_lazy as _
diff --git a/wagtail/contrib/wagtailsearchpromotions/templatetags/wagtailsearchpromotions_tags.py b/wagtail/contrib/wagtailsearchpromotions/templatetags/wagtailsearchpromotions_tags.py
index 26f90b734..3884f4a8a 100644
--- a/wagtail/contrib/wagtailsearchpromotions/templatetags/wagtailsearchpromotions_tags.py
+++ b/wagtail/contrib/wagtailsearchpromotions/templatetags/wagtailsearchpromotions_tags.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import template
from wagtail.contrib.wagtailsearchpromotions.models import SearchPromotion
diff --git a/wagtail/contrib/wagtailsearchpromotions/tests.py b/wagtail/contrib/wagtailsearchpromotions/tests.py
index 451366243..547a55042 100644
--- a/wagtail/contrib/wagtailsearchpromotions/tests.py
+++ b/wagtail/contrib/wagtailsearchpromotions/tests.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/contrib/wagtailsearchpromotions/views.py b/wagtail/contrib/wagtailsearchpromotions/views.py
index 75402d363..f654441c8 100644
--- a/wagtail/contrib/wagtailsearchpromotions/views.py
+++ b/wagtail/contrib/wagtailsearchpromotions/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import ugettext as _
diff --git a/wagtail/contrib/wagtailsearchpromotions/wagtail_hooks.py b/wagtail/contrib/wagtailsearchpromotions/wagtail_hooks.py
index 4a36eccad..2950a38ad 100644
--- a/wagtail/contrib/wagtailsearchpromotions/wagtail_hooks.py
+++ b/wagtail/contrib/wagtailsearchpromotions/wagtail_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import include, url
from django.contrib.auth.models import Permission
from django.core import urlresolvers
diff --git a/wagtail/contrib/wagtailsitemaps/apps.py b/wagtail/contrib/wagtailsitemaps/apps.py
index d8b249a2a..8f96cdda1 100644
--- a/wagtail/contrib/wagtailsitemaps/apps.py
+++ b/wagtail/contrib/wagtailsitemaps/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/wagtailsitemaps/sitemap_generator.py b/wagtail/contrib/wagtailsitemaps/sitemap_generator.py
index e5e43b03e..f2e202d02 100644
--- a/wagtail/contrib/wagtailsitemaps/sitemap_generator.py
+++ b/wagtail/contrib/wagtailsitemaps/sitemap_generator.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.template.loader import render_to_string
diff --git a/wagtail/contrib/wagtailsitemaps/tests.py b/wagtail/contrib/wagtailsitemaps/tests.py
index 6d601e9e7..39eadbe21 100644
--- a/wagtail/contrib/wagtailsitemaps/tests.py
+++ b/wagtail/contrib/wagtailsitemaps/tests.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.cache import cache
from django.test import TestCase
diff --git a/wagtail/contrib/wagtailsitemaps/views.py b/wagtail/contrib/wagtailsitemaps/views.py
index 4feca7dc4..ddf76b36a 100644
--- a/wagtail/contrib/wagtailsitemaps/views.py
+++ b/wagtail/contrib/wagtailsitemaps/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.core.cache import cache
from django.http import HttpResponse
diff --git a/wagtail/contrib/wagtailstyleguide/apps.py b/wagtail/contrib/wagtailstyleguide/apps.py
index 093003ac8..4af868b4f 100644
--- a/wagtail/contrib/wagtailstyleguide/apps.py
+++ b/wagtail/contrib/wagtailstyleguide/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/contrib/wagtailstyleguide/tests.py b/wagtail/contrib/wagtailstyleguide/tests.py
index 8da3420ea..9d0accc64 100644
--- a/wagtail/contrib/wagtailstyleguide/tests.py
+++ b/wagtail/contrib/wagtailstyleguide/tests.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/contrib/wagtailstyleguide/views.py b/wagtail/contrib/wagtailstyleguide/views.py
index eb3436648..0ca94d62e 100644
--- a/wagtail/contrib/wagtailstyleguide/views.py
+++ b/wagtail/contrib/wagtailstyleguide/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import forms
from django.core.paginator import Paginator
from django.shortcuts import render
diff --git a/wagtail/contrib/wagtailstyleguide/wagtail_hooks.py b/wagtail/contrib/wagtailstyleguide/wagtail_hooks.py
index 61dbf4f75..efbee30b8 100644
--- a/wagtail/contrib/wagtailstyleguide/wagtail_hooks.py
+++ b/wagtail/contrib/wagtailstyleguide/wagtail_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from django.core import urlresolvers
from django.utils.translation import ugettext_lazy as _
diff --git a/wagtail/project_template/home/models.py b/wagtail/project_template/home/models.py
index e8278e793..6a7e12aff 100644
--- a/wagtail/project_template/home/models.py
+++ b/wagtail/project_template/home/models.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.db import models
diff --git a/wagtail/project_template/manage.py b/wagtail/project_template/manage.py
index 391dd88ba..493f38dfb 100755
--- a/wagtail/project_template/manage.py
+++ b/wagtail/project_template/manage.py
@@ -1,4 +1,6 @@
#!/usr/bin/env python
+from __future__ import absolute_import, unicode_literals
+
import os
import sys
diff --git a/wagtail/project_template/project_name/settings/base.py b/wagtail/project_template/project_name/settings/base.py
index 28cb1f667..c97563937 100644
--- a/wagtail/project_template/project_name/settings/base.py
+++ b/wagtail/project_template/project_name/settings/base.py
@@ -10,6 +10,8 @@ For the full list of settings and their values, see
https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/
"""
+from __future__ import absolute_import, unicode_literals
+
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
diff --git a/wagtail/project_template/project_name/settings/dev.py b/wagtail/project_template/project_name/settings/dev.py
index e80be76cb..ef3e3f727 100644
--- a/wagtail/project_template/project_name/settings/dev.py
+++ b/wagtail/project_template/project_name/settings/dev.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from .base import *
# SECURITY WARNING: don't run with debug turned on in production!
diff --git a/wagtail/project_template/project_name/settings/production.py b/wagtail/project_template/project_name/settings/production.py
index 9ca4ed752..801b445f7 100644
--- a/wagtail/project_template/project_name/settings/production.py
+++ b/wagtail/project_template/project_name/settings/production.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from .base import *
DEBUG = False
diff --git a/wagtail/project_template/project_name/urls.py b/wagtail/project_template/project_name/urls.py
index 388f4b02d..17dd0da6b 100644
--- a/wagtail/project_template/project_name/urls.py
+++ b/wagtail/project_template/project_name/urls.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin
diff --git a/wagtail/project_template/project_name/wsgi.py b/wagtail/project_template/project_name/wsgi.py
index 0d68b9564..b6340f336 100644
--- a/wagtail/project_template/project_name/wsgi.py
+++ b/wagtail/project_template/project_name/wsgi.py
@@ -7,6 +7,8 @@ For more information on this file, see
https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/wsgi/
"""
+from __future__ import absolute_import, unicode_literals
+
import os
from django.core.wsgi import get_wsgi_application
diff --git a/wagtail/project_template/search/views.py b/wagtail/project_template/search/views.py
index 99113489f..e17a1e9ea 100644
--- a/wagtail/project_template/search/views.py
+++ b/wagtail/project_template/search/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.shortcuts import render
diff --git a/wagtail/tests/context_processors.py b/wagtail/tests/context_processors.py
index 63d0ab683..89d59682b 100644
--- a/wagtail/tests/context_processors.py
+++ b/wagtail/tests/context_processors.py
@@ -1,3 +1,6 @@
+from __future__ import absolute_import, unicode_literals
+
+
def do_not_use_static_url(request):
def exception():
raise Exception("Do not use STATIC_URL in templates. Use the {% static %} templatetag instead.")
diff --git a/wagtail/tests/customuser/models.py b/wagtail/tests/customuser/models.py
index e3440ba6e..9569fcd63 100644
--- a/wagtail/tests/customuser/models.py
+++ b/wagtail/tests/customuser/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import sys
from django.contrib.auth.models import (
diff --git a/wagtail/tests/demosite/models.py b/wagtail/tests/demosite/models.py
index bd04a23cd..289f07a7c 100644
--- a/wagtail/tests/demosite/models.py
+++ b/wagtail/tests/demosite/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from datetime import date
from django.db import models
diff --git a/wagtail/tests/dummy_external_storage.py b/wagtail/tests/dummy_external_storage.py
index 11bbc9365..9d99ee995 100644
--- a/wagtail/tests/dummy_external_storage.py
+++ b/wagtail/tests/dummy_external_storage.py
@@ -5,6 +5,8 @@
# - Calling .path on the storage or image file raises NotImplementedError
# - File.open() after the file has been closed raises an error
+from __future__ import absolute_import, unicode_literals
+
from django.core.files.base import File
from django.core.files.storage import FileSystemStorage, Storage
from django.utils.deconstruct import deconstructible
diff --git a/wagtail/tests/non_root_urls.py b/wagtail/tests/non_root_urls.py
index 43ed2290c..a815e43e5 100644
--- a/wagtail/tests/non_root_urls.py
+++ b/wagtail/tests/non_root_urls.py
@@ -1,6 +1,8 @@
"""An alternative urlconf module where Wagtail front-end URLs
are rooted at '/site/' rather than '/'"""
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import include, url
from wagtail.wagtailadmin import urls as wagtailadmin_urls
diff --git a/wagtail/tests/routablepage/apps.py b/wagtail/tests/routablepage/apps.py
index 8a9f69be8..502056f4a 100644
--- a/wagtail/tests/routablepage/apps.py
+++ b/wagtail/tests/routablepage/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/tests/routablepage/models.py b/wagtail/tests/routablepage/models.py
index 02b6125ff..5b84b782e 100644
--- a/wagtail/tests/routablepage/models.py
+++ b/wagtail/tests/routablepage/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import HttpResponse
from wagtail.contrib.wagtailroutablepage.models import RoutablePage, route
diff --git a/wagtail/tests/search/apps.py b/wagtail/tests/search/apps.py
index a8e8c5ee3..4f567653f 100644
--- a/wagtail/tests/search/apps.py
+++ b/wagtail/tests/search/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/tests/search/models.py b/wagtail/tests/search/models.py
index 41533d2e9..f04e93dfe 100644
--- a/wagtail/tests/search/models.py
+++ b/wagtail/tests/search/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.db import models
from taggit.managers import TaggableManager
diff --git a/wagtail/tests/settings.py b/wagtail/tests/settings.py
index 1d1ccf50a..36cbd54a2 100644
--- a/wagtail/tests/settings.py
+++ b/wagtail/tests/settings.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import os
WAGTAIL_ROOT = os.path.dirname(__file__)
diff --git a/wagtail/tests/snippets/apps.py b/wagtail/tests/snippets/apps.py
index 26004ec2b..c84f125b1 100644
--- a/wagtail/tests/snippets/apps.py
+++ b/wagtail/tests/snippets/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/tests/snippets/forms.py b/wagtail/tests/snippets/forms.py
index 1ce940393..15847ebb8 100644
--- a/wagtail/tests/snippets/forms.py
+++ b/wagtail/tests/snippets/forms.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from wagtail.wagtailadmin.forms import WagtailAdminModelForm
diff --git a/wagtail/tests/snippets/models.py b/wagtail/tests/snippets/models.py
index d2c9af0b6..bd0b6be04 100644
--- a/wagtail/tests/snippets/models.py
+++ b/wagtail/tests/snippets/models.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
diff --git a/wagtail/tests/test_utils.py b/wagtail/tests/test_utils.py
index cac2ca929..46838427c 100644
--- a/wagtail/tests/test_utils.py
+++ b/wagtail/tests/test_utils.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import warnings
diff --git a/wagtail/tests/testapp/apps.py b/wagtail/tests/testapp/apps.py
index 8dedd7f25..c8675b242 100644
--- a/wagtail/tests/testapp/apps.py
+++ b/wagtail/tests/testapp/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/tests/testapp/blocks.py b/wagtail/tests/testapp/blocks.py
index a0df558c7..c4f5add34 100644
--- a/wagtail/tests/testapp/blocks.py
+++ b/wagtail/tests/testapp/blocks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from wagtail.wagtailcore import blocks
diff --git a/wagtail/tests/testapp/forms.py b/wagtail/tests/testapp/forms.py
index 0c617f676..e8b196863 100644
--- a/wagtail/tests/testapp/forms.py
+++ b/wagtail/tests/testapp/forms.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import forms
from wagtail.wagtailadmin.forms import WagtailAdminPageForm
diff --git a/wagtail/tests/testapp/models.py b/wagtail/tests/testapp/models.py
index afd1b4bb1..e1b73c43e 100644
--- a/wagtail/tests/testapp/models.py
+++ b/wagtail/tests/testapp/models.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import hashlib
import os
diff --git a/wagtail/tests/testapp/urls.py b/wagtail/tests/testapp/urls.py
index daf336821..509697473 100644
--- a/wagtail/tests/testapp/urls.py
+++ b/wagtail/tests/testapp/urls.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from wagtail.tests.testapp.views import bob_only_zone
diff --git a/wagtail/tests/testapp/views.py b/wagtail/tests/testapp/views.py
index 5bc8dc4b3..61f5bf5dc 100644
--- a/wagtail/tests/testapp/views.py
+++ b/wagtail/tests/testapp/views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import HttpResponse
from wagtail.wagtailadmin.utils import user_passes_test
diff --git a/wagtail/tests/testapp/wagtail_hooks.py b/wagtail/tests/testapp/wagtail_hooks.py
index 4374bf4d8..16f15effb 100644
--- a/wagtail/tests/testapp/wagtail_hooks.py
+++ b/wagtail/tests/testapp/wagtail_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import HttpResponse
from wagtail.wagtailadmin.menu import MenuItem
diff --git a/wagtail/tests/urls.py b/wagtail/tests/urls.py
index 92ab8b358..29de8aaeb 100644
--- a/wagtail/tests/urls.py
+++ b/wagtail/tests/urls.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import include, url
from wagtail.api.v2 import urls as wagtailapi2_urls
diff --git a/wagtail/utils/apps.py b/wagtail/utils/apps.py
index cd6f17c2f..93786a27f 100644
--- a/wagtail/utils/apps.py
+++ b/wagtail/utils/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from importlib import import_module
from django.apps import apps
diff --git a/wagtail/utils/compat.py b/wagtail/utils/compat.py
index 5318163e4..b23cf3c44 100644
--- a/wagtail/utils/compat.py
+++ b/wagtail/utils/compat.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import warnings
from django.template import loader
diff --git a/wagtail/utils/deprecation.py b/wagtail/utils/deprecation.py
index 252792e60..e06866215 100644
--- a/wagtail/utils/deprecation.py
+++ b/wagtail/utils/deprecation.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import warnings
diff --git a/wagtail/utils/pagination.py b/wagtail/utils/pagination.py
index e8fecc388..f144025be 100644
--- a/wagtail/utils/pagination.py
+++ b/wagtail/utils/pagination.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
DEFAULT_PAGE_KEY = 'p'
diff --git a/wagtail/utils/sendfile.py b/wagtail/utils/sendfile.py
index 0d01dda5e..ea59dea38 100644
--- a/wagtail/utils/sendfile.py
+++ b/wagtail/utils/sendfile.py
@@ -1,6 +1,8 @@
# Copied from django-sendfile 0.3.6 and tweaked to allow a backend to be passed
# to sendfile()
# See: https://github.com/johnsensible/django-sendfile/pull/33
+from __future__ import absolute_import, unicode_literals
+
import os.path
from mimetypes import guess_type
diff --git a/wagtail/utils/sendfile_streaming_backend.py b/wagtail/utils/sendfile_streaming_backend.py
index 2ad5f6258..1aea89599 100644
--- a/wagtail/utils/sendfile_streaming_backend.py
+++ b/wagtail/utils/sendfile_streaming_backend.py
@@ -1,6 +1,8 @@
# Sendfile "streaming" backend
# This is based on sendfiles builtin "simple" backend but uses a StreamingHttpResponse
+from __future__ import absolute_import, unicode_literals
+
import os
import re
import stat
diff --git a/wagtail/utils/urlpatterns.py b/wagtail/utils/urlpatterns.py
index 131a8f00b..3a3f35d55 100644
--- a/wagtail/utils/urlpatterns.py
+++ b/wagtail/utils/urlpatterns.py
@@ -1,3 +1,6 @@
+from __future__ import absolute_import, unicode_literals
+
+
def decorate_urlpatterns(urlpatterns, decorator):
for pattern in urlpatterns:
if hasattr(pattern, 'url_patterns'):
diff --git a/wagtail/wagtailadmin/apps.py b/wagtail/wagtailadmin/apps.py
index 7130ba77f..5ee4a5f23 100644
--- a/wagtail/wagtailadmin/apps.py
+++ b/wagtail/wagtailadmin/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
from . import checks # NOQA
diff --git a/wagtail/wagtailadmin/blocks.py b/wagtail/wagtailadmin/blocks.py
index e43dbe5d3..b46ebc3b0 100644
--- a/wagtail/wagtailadmin/blocks.py
+++ b/wagtail/wagtailadmin/blocks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import warnings
from wagtail.wagtailcore.blocks import * # noqa
diff --git a/wagtail/wagtailadmin/checks.py b/wagtail/wagtailadmin/checks.py
index f15a9e197..14af7fb14 100644
--- a/wagtail/wagtailadmin/checks.py
+++ b/wagtail/wagtailadmin/checks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import os
from django.core.checks import Warning, register
diff --git a/wagtail/wagtailadmin/decorators.py b/wagtail/wagtailadmin/decorators.py
index ea3632b6b..a4df311e5 100644
--- a/wagtail/wagtailadmin/decorators.py
+++ b/wagtail/wagtailadmin/decorators.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _
diff --git a/wagtail/wagtailadmin/edit_handlers.py b/wagtail/wagtailadmin/edit_handlers.py
index 1b6f190a8..9e6402421 100644
--- a/wagtail/wagtailadmin/edit_handlers.py
+++ b/wagtail/wagtailadmin/edit_handlers.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import django
from django import forms
diff --git a/wagtail/wagtailadmin/forms.py b/wagtail/wagtailadmin/forms.py
index e75676285..e4ba72b14 100644
--- a/wagtail/wagtailadmin/forms.py
+++ b/wagtail/wagtailadmin/forms.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import copy
from itertools import groupby
diff --git a/wagtail/wagtailadmin/jinja2tags.py b/wagtail/wagtailadmin/jinja2tags.py
index bb5bb276b..dc3c4ecf4 100644
--- a/wagtail/wagtailadmin/jinja2tags.py
+++ b/wagtail/wagtailadmin/jinja2tags.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
import jinja2
from jinja2.ext import Extension
diff --git a/wagtail/wagtailadmin/menu.py b/wagtail/wagtailadmin/menu.py
index 5f9eb3cb5..22cc45a2f 100644
--- a/wagtail/wagtailadmin/menu.py
+++ b/wagtail/wagtailadmin/menu.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.contrib.staticfiles.templatetags.staticfiles import static
from django.forms import Media, MediaDefiningClass
diff --git a/wagtail/wagtailadmin/messages.py b/wagtail/wagtailadmin/messages.py
index bc8f41016..917091ea9 100644
--- a/wagtail/wagtailadmin/messages.py
+++ b/wagtail/wagtailadmin/messages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib import messages
from django.template.loader import render_to_string
diff --git a/wagtail/wagtailadmin/modal_workflow.py b/wagtail/wagtailadmin/modal_workflow.py
index ac46d5d12..6ff696360 100644
--- a/wagtail/wagtailadmin/modal_workflow.py
+++ b/wagtail/wagtailadmin/modal_workflow.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import json
from django.http import HttpResponse
diff --git a/wagtail/wagtailadmin/models.py b/wagtail/wagtailadmin/models.py
index 3eff443f5..22e2cd7fe 100644
--- a/wagtail/wagtailadmin/models.py
+++ b/wagtail/wagtailadmin/models.py
@@ -1,3 +1,3 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
# Create your models here.
diff --git a/wagtail/wagtailadmin/search.py b/wagtail/wagtailadmin/search.py
index 9f5ddf165..ce598425c 100644
--- a/wagtail/wagtailadmin/search.py
+++ b/wagtail/wagtailadmin/search.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.forms import Media, MediaDefiningClass
from django.forms.utils import flatatt
diff --git a/wagtail/wagtailadmin/signals.py b/wagtail/wagtailadmin/signals.py
index e2c8bc199..2fb73b160 100644
--- a/wagtail/wagtailadmin/signals.py
+++ b/wagtail/wagtailadmin/signals.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.dispatch import Signal
init_new_page = Signal(providing_args=['page', 'parent'])
diff --git a/wagtail/wagtailadmin/site_summary.py b/wagtail/wagtailadmin/site_summary.py
index d4d14c7d8..de71a9166 100644
--- a/wagtail/wagtailadmin/site_summary.py
+++ b/wagtail/wagtailadmin/site_summary.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.template.loader import render_to_string
from wagtail.wagtailcore import hooks
diff --git a/wagtail/wagtailadmin/taggable.py b/wagtail/wagtailadmin/taggable.py
index 0f113169c..56b4f9d82 100644
--- a/wagtail/wagtailadmin/taggable.py
+++ b/wagtail/wagtailadmin/taggable.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.contenttypes.models import ContentType
from django.db.models import Count
from taggit.models import Tag
diff --git a/wagtail/wagtailadmin/templatetags/gravatar.py b/wagtail/wagtailadmin/templatetags/gravatar.py
index 6507da9df..934a080bb 100644
--- a/wagtail/wagtailadmin/templatetags/gravatar.py
+++ b/wagtail/wagtailadmin/templatetags/gravatar.py
@@ -7,6 +7,8 @@
#
# just make sure to update the "default" image path below
+from __future__ import absolute_import, unicode_literals
+
import hashlib
from django import template
diff --git a/wagtail/wagtailadmin/templatetags/wagtailadmin_tags.py b/wagtail/wagtailadmin/templatetags/wagtailadmin_tags.py
index 25c2c5195..7a61ce68c 100644
--- a/wagtail/wagtailadmin/templatetags/wagtailadmin_tags.py
+++ b/wagtail/wagtailadmin/templatetags/wagtailadmin_tags.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import itertools
diff --git a/wagtail/wagtailadmin/templatetags/wagtailuserbar.py b/wagtail/wagtailadmin/templatetags/wagtailuserbar.py
index 05a906fea..3c8564a52 100644
--- a/wagtail/wagtailadmin/templatetags/wagtailuserbar.py
+++ b/wagtail/wagtailadmin/templatetags/wagtailuserbar.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import template
from django.template.loader import render_to_string
diff --git a/wagtail/wagtailadmin/tests/test_account_management.py b/wagtail/wagtailadmin/tests/test_account_management.py
index 424af28aa..8ae91095d 100644
--- a/wagtail/wagtailadmin/tests/test_account_management.py
+++ b/wagtail/wagtailadmin/tests/test_account_management.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission
diff --git a/wagtail/wagtailadmin/tests/test_buttons_hooks.py b/wagtail/wagtailadmin/tests/test_buttons_hooks.py
index ccb0175f6..57af6f933 100644
--- a/wagtail/wagtailadmin/tests/test_buttons_hooks.py
+++ b/wagtail/wagtailadmin/tests/test_buttons_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/wagtailadmin/tests/test_collections_views.py b/wagtail/wagtailadmin/tests/test_collections_views.py
index 4ffe1a838..14242cf0b 100644
--- a/wagtail/wagtailadmin/tests/test_collections_views.py
+++ b/wagtail/wagtailadmin/tests/test_collections_views.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py
index 7ff38d306..e5de7f3b4 100644
--- a/wagtail/wagtailadmin/tests/test_edit_handlers.py
+++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from datetime import date
import mock
diff --git a/wagtail/wagtailadmin/tests/test_page_chooser.py b/wagtail/wagtailadmin/tests/test_page_chooser.py
index f363b5237..b1a53b101 100644
--- a/wagtail/wagtailadmin/tests/test_page_chooser.py
+++ b/wagtail/wagtailadmin/tests/test_page_chooser.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/wagtailadmin/tests/test_pages_views.py b/wagtail/wagtailadmin/tests/test_pages_views.py
index cdf39d7d4..752476544 100644
--- a/wagtail/wagtailadmin/tests/test_pages_views.py
+++ b/wagtail/wagtailadmin/tests/test_pages_views.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import datetime
import django
diff --git a/wagtail/wagtailadmin/tests/test_password_reset.py b/wagtail/wagtailadmin/tests/test_password_reset.py
index 8151a214e..2624ad06b 100644
--- a/wagtail/wagtailadmin/tests/test_password_reset.py
+++ b/wagtail/wagtailadmin/tests/test_password_reset.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core import mail
from django.core.urlresolvers import reverse
from django.test import TestCase, override_settings
diff --git a/wagtail/wagtailadmin/tests/test_privacy.py b/wagtail/wagtailadmin/tests/test_privacy.py
index 7666f056e..962c5657a 100644
--- a/wagtail/wagtailadmin/tests/test_privacy.py
+++ b/wagtail/wagtailadmin/tests/test_privacy.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.test import TestCase
diff --git a/wagtail/wagtailadmin/tests/test_userbar.py b/wagtail/wagtailadmin/tests/test_userbar.py
index 611674eae..1fa18f673 100644
--- a/wagtail/wagtailadmin/tests/test_userbar.py
+++ b/wagtail/wagtailadmin/tests/test_userbar.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from django.core.urlresolvers import reverse
diff --git a/wagtail/wagtailadmin/tests/test_widgets.py b/wagtail/wagtailadmin/tests/test_widgets.py
index 1d6d394a7..1fcba82bb 100644
--- a/wagtail/wagtailadmin/tests/test_widgets.py
+++ b/wagtail/wagtailadmin/tests/test_widgets.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.contenttypes.models import ContentType
from django.test import TestCase
diff --git a/wagtail/wagtailadmin/tests/tests.py b/wagtail/wagtailadmin/tests/tests.py
index 204257b4b..c74496469 100644
--- a/wagtail/wagtailadmin/tests/tests.py
+++ b/wagtail/wagtailadmin/tests/tests.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/wagtailadmin/urls/collections.py b/wagtail/wagtailadmin/urls/collections.py
index f1b5842e4..34a4cfec3 100644
--- a/wagtail/wagtailadmin/urls/collections.py
+++ b/wagtail/wagtailadmin/urls/collections.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from wagtail.wagtailadmin.views import collections
diff --git a/wagtail/wagtailadmin/urls/pages.py b/wagtail/wagtailadmin/urls/pages.py
index bf315131f..5c39c7999 100644
--- a/wagtail/wagtailadmin/urls/pages.py
+++ b/wagtail/wagtailadmin/urls/pages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from wagtail.wagtailadmin.views import page_privacy, pages
diff --git a/wagtail/wagtailadmin/urls/password_reset.py b/wagtail/wagtailadmin/urls/password_reset.py
index abb130880..ebcec4af7 100644
--- a/wagtail/wagtailadmin/urls/password_reset.py
+++ b/wagtail/wagtailadmin/urls/password_reset.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf.urls import url
from wagtail.wagtailadmin.forms import PasswordResetForm
diff --git a/wagtail/wagtailadmin/userbar.py b/wagtail/wagtailadmin/userbar.py
index a841a14de..7a1fb9415 100644
--- a/wagtail/wagtailadmin/userbar.py
+++ b/wagtail/wagtailadmin/userbar.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.template.loader import render_to_string
diff --git a/wagtail/wagtailadmin/utils.py b/wagtail/wagtailadmin/utils.py
index 6bd740c23..65474258d 100644
--- a/wagtail/wagtailadmin/utils.py
+++ b/wagtail/wagtailadmin/utils.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from functools import wraps
from django.conf import settings
diff --git a/wagtail/wagtailadmin/views/account.py b/wagtail/wagtailadmin/views/account.py
index 7d48b1ba4..84eb9033c 100644
--- a/wagtail/wagtailadmin/views/account.py
+++ b/wagtail/wagtailadmin/views/account.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from functools import wraps
from django.conf import settings
diff --git a/wagtail/wagtailadmin/views/chooser.py b/wagtail/wagtailadmin/views/chooser.py
index ab0e1f777..e2d4e6051 100644
--- a/wagtail/wagtailadmin/views/chooser.py
+++ b/wagtail/wagtailadmin/views/chooser.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import Http404
from django.shortcuts import get_object_or_404, render
diff --git a/wagtail/wagtailadmin/views/collections.py b/wagtail/wagtailadmin/views/collections.py
index d3d3b20fc..a23e9879b 100644
--- a/wagtail/wagtailadmin/views/collections.py
+++ b/wagtail/wagtailadmin/views/collections.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import ugettext_lazy as __
diff --git a/wagtail/wagtailadmin/views/generic.py b/wagtail/wagtailadmin/views/generic.py
index 7b1a799d5..e03fd0865 100644
--- a/wagtail/wagtailadmin/views/generic.py
+++ b/wagtail/wagtailadmin/views/generic.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import ugettext as _
diff --git a/wagtail/wagtailadmin/views/home.py b/wagtail/wagtailadmin/views/home.py
index 06c26fdd9..f05fd49e3 100644
--- a/wagtail/wagtailadmin/views/home.py
+++ b/wagtail/wagtailadmin/views/home.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.db.models import F
from django.shortcuts import render
diff --git a/wagtail/wagtailadmin/views/page_privacy.py b/wagtail/wagtailadmin/views/page_privacy.py
index e211ed3ce..4944211f0 100644
--- a/wagtail/wagtailadmin/views/page_privacy.py
+++ b/wagtail/wagtailadmin/views/page_privacy.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
diff --git a/wagtail/wagtailadmin/views/pages.py b/wagtail/wagtailadmin/views/pages.py
index daa092f04..01a7c3a63 100644
--- a/wagtail/wagtailadmin/views/pages.py
+++ b/wagtail/wagtailadmin/views/pages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
diff --git a/wagtail/wagtailadmin/views/tags.py b/wagtail/wagtailadmin/views/tags.py
index 6662fcd9b..d06480dc9 100644
--- a/wagtail/wagtailadmin/views/tags.py
+++ b/wagtail/wagtailadmin/views/tags.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.http import JsonResponse
from taggit.models import Tag
diff --git a/wagtail/wagtailadmin/views/userbar.py b/wagtail/wagtailadmin/views/userbar.py
index 34f54ec0d..d5582e96f 100644
--- a/wagtail/wagtailadmin/views/userbar.py
+++ b/wagtail/wagtailadmin/views/userbar.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
diff --git a/wagtail/wagtailadmin/wagtail_hooks.py b/wagtail/wagtailadmin/wagtail_hooks.py
index 4217284d0..3c3bbbedb 100644
--- a/wagtail/wagtailadmin/wagtail_hooks.py
+++ b/wagtail/wagtailadmin/wagtail_hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import forms
from django.contrib.auth.models import Permission
from django.contrib.staticfiles.templatetags.staticfiles import static
diff --git a/wagtail/wagtailcore/admin.py b/wagtail/wagtailcore/admin.py
index e73b6a418..bc3fc2917 100644
--- a/wagtail/wagtailcore/admin.py
+++ b/wagtail/wagtailcore/admin.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib import admin
from django.contrib.auth.admin import GroupAdmin
from django.contrib.auth.models import Group
diff --git a/wagtail/wagtailcore/apps.py b/wagtail/wagtailcore/apps.py
index b4ef506dc..9be2b08a8 100644
--- a/wagtail/wagtailcore/apps.py
+++ b/wagtail/wagtailcore/apps.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.apps import AppConfig
diff --git a/wagtail/wagtailcore/blocks/utils.py b/wagtail/wagtailcore/blocks/utils.py
index 19c3eb927..80be6bdba 100644
--- a/wagtail/wagtailcore/blocks/utils.py
+++ b/wagtail/wagtailcore/blocks/utils.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import re
diff --git a/wagtail/wagtailcore/compat.py b/wagtail/wagtailcore/compat.py
index a5499ad84..222aa3966 100644
--- a/wagtail/wagtailcore/compat.py
+++ b/wagtail/wagtailcore/compat.py
@@ -1,12 +1,14 @@
+from __future__ import absolute_import, unicode_literals
+
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
-# A setting that can be used in foreign key declarations
-AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
-# Two additional settings that are useful in South migrations when
-# specifying the user model in the FakeORM
-try:
- AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME = AUTH_USER_MODEL.rsplit('.', 1)
-except ValueError:
- raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form"
- " 'app_label.model_name'")
+# A setting that can be used in foreign key declarations
+AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
+# Two additional settings that are useful in South migrations when
+# specifying the user model in the FakeORM
+try:
+ AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME = AUTH_USER_MODEL.rsplit('.', 1)
+except ValueError:
+ raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form"
+ " 'app_label.model_name'")
diff --git a/wagtail/wagtailcore/forms.py b/wagtail/wagtailcore/forms.py
index 48e0e685e..f7c7f7025 100644
--- a/wagtail/wagtailcore/forms.py
+++ b/wagtail/wagtailcore/forms.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import forms
diff --git a/wagtail/wagtailcore/hooks.py b/wagtail/wagtailcore/hooks.py
index d2ff96019..4b3e4abf1 100644
--- a/wagtail/wagtailcore/hooks.py
+++ b/wagtail/wagtailcore/hooks.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from wagtail.utils.apps import get_app_submodules
_hooks = {}
diff --git a/wagtail/wagtailcore/jinja2tags.py b/wagtail/wagtailcore/jinja2tags.py
index 7d25585bf..afd8cd264 100644
--- a/wagtail/wagtailcore/jinja2tags.py
+++ b/wagtail/wagtailcore/jinja2tags.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
import jinja2
from jinja2.ext import Extension
diff --git a/wagtail/wagtailcore/management/commands/fixtree.py b/wagtail/wagtailcore/management/commands/fixtree.py
index 65e7b60a2..9e9c800f2 100644
--- a/wagtail/wagtailcore/management/commands/fixtree.py
+++ b/wagtail/wagtailcore/management/commands/fixtree.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
import functools
import operator
diff --git a/wagtail/wagtailcore/management/commands/move_pages.py b/wagtail/wagtailcore/management/commands/move_pages.py
index d8b7b1c1a..7ff63902d 100644
--- a/wagtail/wagtailcore/management/commands/move_pages.py
+++ b/wagtail/wagtailcore/management/commands/move_pages.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.management.base import BaseCommand
from wagtail.wagtailcore.models import Page
diff --git a/wagtail/wagtailcore/management/commands/publish_scheduled_pages.py b/wagtail/wagtailcore/management/commands/publish_scheduled_pages.py
index 4fdbec39f..a81ca3b3e 100644
--- a/wagtail/wagtailcore/management/commands/publish_scheduled_pages.py
+++ b/wagtail/wagtailcore/management/commands/publish_scheduled_pages.py
@@ -1,4 +1,4 @@
-from __future__ import print_function
+from __future__ import absolute_import, print_function, unicode_literals
import json
diff --git a/wagtail/wagtailcore/management/commands/replace_text.py b/wagtail/wagtailcore/management/commands/replace_text.py
index 848b93901..3cc031978 100644
--- a/wagtail/wagtailcore/management/commands/replace_text.py
+++ b/wagtail/wagtailcore/management/commands/replace_text.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.management.base import BaseCommand
from django.db import models
from modelcluster.models import get_all_child_relations
diff --git a/wagtail/wagtailcore/management/commands/set_url_paths.py b/wagtail/wagtailcore/management/commands/set_url_paths.py
index 1c74d7018..5e26ec87a 100644
--- a/wagtail/wagtailcore/management/commands/set_url_paths.py
+++ b/wagtail/wagtailcore/management/commands/set_url_paths.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.management.base import NoArgsCommand
from wagtail.wagtailcore.models import Page
diff --git a/wagtail/wagtailcore/middleware.py b/wagtail/wagtailcore/middleware.py
index fbb10e5f1..4c9b0d377 100644
--- a/wagtail/wagtailcore/middleware.py
+++ b/wagtail/wagtailcore/middleware.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from wagtail.wagtailcore.models import Site
diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py
index 74a841851..57dd2124b 100644
--- a/wagtail/wagtailcore/models.py
+++ b/wagtail/wagtailcore/models.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
import logging
diff --git a/wagtail/wagtailcore/permission_policies/base.py b/wagtail/wagtailcore/permission_policies/base.py
index 2757bd896..142d1d1cb 100644
--- a/wagtail/wagtailcore/permission_policies/base.py
+++ b/wagtail/wagtailcore/permission_policies/base.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
diff --git a/wagtail/wagtailcore/permission_policies/collections.py b/wagtail/wagtailcore/permission_policies/collections.py
index 7beb9d7a3..24964c070 100644
--- a/wagtail/wagtailcore/permission_policies/collections.py
+++ b/wagtail/wagtailcore/permission_policies/collections.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission
from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured
diff --git a/wagtail/wagtailcore/permissions.py b/wagtail/wagtailcore/permissions.py
index d1040da76..d94dd9ae5 100644
--- a/wagtail/wagtailcore/permissions.py
+++ b/wagtail/wagtailcore/permissions.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from wagtail.wagtailcore.models import Collection, Site
from wagtail.wagtailcore.permission_policies import ModelPermissionPolicy
diff --git a/wagtail/wagtailcore/query.py b/wagtail/wagtailcore/query.py
index 40d26cf6c..e6386f43f 100644
--- a/wagtail/wagtailcore/query.py
+++ b/wagtail/wagtailcore/query.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from collections import defaultdict
from django import VERSION as DJANGO_VERSION
diff --git a/wagtail/wagtailcore/rich_text.py b/wagtail/wagtailcore/rich_text.py
index 38515c23f..af0b77839 100644
--- a/wagtail/wagtailcore/rich_text.py
+++ b/wagtail/wagtailcore/rich_text.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals # ensure that RichText.__str__ returns unicode
+from __future__ import absolute_import, unicode_literals
import re # parsing HTML with regexes LIKE A BOSS.
diff --git a/wagtail/wagtailcore/signals.py b/wagtail/wagtailcore/signals.py
index 2f3997ca0..4e3d87a51 100644
--- a/wagtail/wagtailcore/signals.py
+++ b/wagtail/wagtailcore/signals.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.dispatch import Signal
page_published = Signal(providing_args=['instance', 'revision'])
diff --git a/wagtail/wagtailcore/templatetags/wagtailcore_tags.py b/wagtail/wagtailcore/templatetags/wagtailcore_tags.py
index bc74c116d..55d4e3a93 100644
--- a/wagtail/wagtailcore/templatetags/wagtailcore_tags.py
+++ b/wagtail/wagtailcore/templatetags/wagtailcore_tags.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django import template
from django.utils.safestring import mark_safe
diff --git a/wagtail/wagtailcore/tests/test_blocks.py b/wagtail/wagtailcore/tests/test_blocks.py
index e094f0fb6..24fa5bac5 100644
--- a/wagtail/wagtailcore/tests/test_blocks.py
+++ b/wagtail/wagtailcore/tests/test_blocks.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import base64
import unittest
diff --git a/wagtail/wagtailcore/tests/test_collection_model.py b/wagtail/wagtailcore/tests/test_collection_model.py
index 1700d7d53..eb591907b 100644
--- a/wagtail/wagtailcore/tests/test_collection_model.py
+++ b/wagtail/wagtailcore/tests/test_collection_model.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.test import TestCase
from wagtail.wagtailcore.models import Collection
diff --git a/wagtail/wagtailcore/tests/test_collection_permission_policies.py b/wagtail/wagtailcore/tests/test_collection_permission_policies.py
index c74d65feb..20db54bd2 100644
--- a/wagtail/wagtailcore/tests/test_collection_permission_policies.py
+++ b/wagtail/wagtailcore/tests/test_collection_permission_policies.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Group, Permission
from django.contrib.contenttypes.models import ContentType
diff --git a/wagtail/wagtailcore/tests/test_dbwhitelister.py b/wagtail/wagtailcore/tests/test_dbwhitelister.py
index e0dc89afe..2ada14609 100644
--- a/wagtail/wagtailcore/tests/test_dbwhitelister.py
+++ b/wagtail/wagtailcore/tests/test_dbwhitelister.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from bs4 import BeautifulSoup
from django.test import TestCase
diff --git a/wagtail/wagtailcore/tests/test_management_commands.py b/wagtail/wagtailcore/tests/test_management_commands.py
index 6ae2f03e5..1d7b0528f 100644
--- a/wagtail/wagtailcore/tests/test_management_commands.py
+++ b/wagtail/wagtailcore/tests/test_management_commands.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from datetime import timedelta
from django.core import management
diff --git a/wagtail/wagtailcore/tests/test_migrations.py b/wagtail/wagtailcore/tests/test_migrations.py
index 305b9923f..967b20680 100644
--- a/wagtail/wagtailcore/tests/test_migrations.py
+++ b/wagtail/wagtailcore/tests/test_migrations.py
@@ -3,6 +3,8 @@ Check that all changes to Wagtail models have had migrations created. If there
are outstanding model changes that need migrations, fail the tests.
"""
+from __future__ import absolute_import, unicode_literals
+
from django.apps import apps
from django.db.migrations.autodetector import MigrationAutodetector
from django.db.migrations.loader import MigrationLoader
diff --git a/wagtail/wagtailcore/tests/test_page_model.py b/wagtail/wagtailcore/tests/test_page_model.py
index c84d62914..831174fd2 100644
--- a/wagtail/wagtailcore/tests/test_page_model.py
+++ b/wagtail/wagtailcore/tests/test_page_model.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import datetime
import json
diff --git a/wagtail/wagtailcore/tests/test_page_permissions.py b/wagtail/wagtailcore/tests/test_page_permissions.py
index 35ad120c2..475604422 100644
--- a/wagtail/wagtailcore/tests/test_page_permissions.py
+++ b/wagtail/wagtailcore/tests/test_page_permissions.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.test import TestCase
diff --git a/wagtail/wagtailcore/tests/test_page_privacy.py b/wagtail/wagtailcore/tests/test_page_privacy.py
index 23f623e8a..2abc6a1c2 100644
--- a/wagtail/wagtailcore/tests/test_page_privacy.py
+++ b/wagtail/wagtailcore/tests/test_page_privacy.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.test import TestCase
from wagtail.wagtailcore.models import Page, PageViewRestriction
diff --git a/wagtail/wagtailcore/tests/test_page_queryset.py b/wagtail/wagtailcore/tests/test_page_queryset.py
index bbb430def..6d6bc89a8 100644
--- a/wagtail/wagtailcore/tests/test_page_queryset.py
+++ b/wagtail/wagtailcore/tests/test_page_queryset.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.test import TestCase
from wagtail.tests.testapp.models import EventPage, SingleEventPage
diff --git a/wagtail/wagtailcore/tests/test_permission_policies.py b/wagtail/wagtailcore/tests/test_permission_policies.py
index 970167d77..684cf6284 100644
--- a/wagtail/wagtailcore/tests/test_permission_policies.py
+++ b/wagtail/wagtailcore/tests/test_permission_policies.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Group, Permission
from django.contrib.contenttypes.models import ContentType
diff --git a/wagtail/wagtailcore/tests/test_rich_text.py b/wagtail/wagtailcore/tests/test_rich_text.py
index 16d82b5e3..4e0a31ad6 100644
--- a/wagtail/wagtailcore/tests/test_rich_text.py
+++ b/wagtail/wagtailcore/tests/test_rich_text.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from bs4 import BeautifulSoup
from django.test import TestCase
from mock import patch
diff --git a/wagtail/wagtailcore/tests/test_sites.py b/wagtail/wagtailcore/tests/test_sites.py
index 0016f9db8..1625281aa 100644
--- a/wagtail/wagtailcore/tests/test_sites.py
+++ b/wagtail/wagtailcore/tests/test_sites.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.exceptions import ValidationError
from django.http.request import HttpRequest
from django.test import TestCase
diff --git a/wagtail/wagtailcore/tests/test_streamfield.py b/wagtail/wagtailcore/tests/test_streamfield.py
index ba5347478..af78aa2b8 100644
--- a/wagtail/wagtailcore/tests/test_streamfield.py
+++ b/wagtail/wagtailcore/tests/test_streamfield.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
import json
diff --git a/wagtail/wagtailcore/tests/test_utils.py b/wagtail/wagtailcore/tests/test_utils.py
index 2c526c3b4..a0940757e 100644
--- a/wagtail/wagtailcore/tests/test_utils.py
+++ b/wagtail/wagtailcore/tests/test_utils.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
from django.test import TestCase
from django.utils.text import slugify
diff --git a/wagtail/wagtailcore/tests/test_whitelist.py b/wagtail/wagtailcore/tests/test_whitelist.py
index 8c1858da5..21dadb2df 100644
--- a/wagtail/wagtailcore/tests/test_whitelist.py
+++ b/wagtail/wagtailcore/tests/test_whitelist.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import, unicode_literals
+
from bs4 import BeautifulSoup
from django.test import TestCase
diff --git a/wagtail/wagtailcore/tests/tests.py b/wagtail/wagtailcore/tests/tests.py
index 7e69aa465..90902c205 100644
--- a/wagtail/wagtailcore/tests/tests.py
+++ b/wagtail/wagtailcore/tests/tests.py
@@ -1,6 +1,8 @@
+from __future__ import absolute_import, unicode_literals
+
from django.core.cache import cache
from django.test import TestCase
-from django.utils.safestring import SafeString
+from django.utils.safestring import SafeText
from wagtail.tests.testapp.models import SimplePage
from wagtail.wagtailcore.models import Page, Site
@@ -194,7 +196,7 @@ class TestRichtextTag(TestCase):
def test_call_with_text(self):
result = richtext("Hello world!")
self.assertEqual(result, '