diff --git a/.travis.yml b/.travis.yml
index a98d547978f37b593d2445b3d554ddda67f46eed..b34b17af758f028d146267379466f37400c677f4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,6 +23,9 @@ matrix:
   - python: 3.6
     env: TOX_ENV=py36
 
+  - python: 3.6
+    env: TOX_ENV=check_isort
+
   - python: 3.6
     env: TOX_ENV=check-newsfragment
 
diff --git a/changelog.d/3540.misc b/changelog.d/3540.misc
new file mode 100644
index 0000000000000000000000000000000000000000..99dcad8e46eb0f1467e858c4bc07bde485472786
--- /dev/null
+++ b/changelog.d/3540.misc
@@ -0,0 +1 @@
+check isort for each PR
diff --git a/synapse/http/site.py b/synapse/http/site.py
index 21e26f9c5e442bab8194938f1b5736de2b604fc8..41dd974cea4cbf991c6da3a31ac05d3276cdb181 100644
--- a/synapse/http/site.py
+++ b/synapse/http/site.py
@@ -20,7 +20,7 @@ from twisted.web.server import Request, Site
 
 from synapse.http import redact_uri
 from synapse.http.request_metrics import RequestMetrics
-from synapse.util.logcontext import LoggingContext, ContextResourceUsage
+from synapse.util.logcontext import ContextResourceUsage, LoggingContext
 
 logger = logging.getLogger(__name__)
 
diff --git a/synapse/rest/client/v1/admin.py b/synapse/rest/client/v1/admin.py
index 01c3f2eb0449fd04a96b26de9226db645d8745c6..2dc50e582b14f275a08d48d14401cd54010db78a 100644
--- a/synapse/rest/client/v1/admin.py
+++ b/synapse/rest/client/v1/admin.py
@@ -24,9 +24,9 @@ from synapse.api.constants import Membership
 from synapse.api.errors import AuthError, Codes, NotFoundError, SynapseError
 from synapse.http.servlet import (
     assert_params_in_dict,
-    parse_json_object_from_request,
     parse_integer,
-    parse_string
+    parse_json_object_from_request,
+    parse_string,
 )
 from synapse.types import UserID, create_requester
 
diff --git a/synapse/rest/client/v1/initial_sync.py b/synapse/rest/client/v1/initial_sync.py
index 00a1a99feb800caf96531d691d44019025daffb3..fd5f85b53ee6879d954e823a383f1b971a4e1b96 100644
--- a/synapse/rest/client/v1/initial_sync.py
+++ b/synapse/rest/client/v1/initial_sync.py
@@ -15,8 +15,8 @@
 
 from twisted.internet import defer
 
-from synapse.streams.config import PaginationConfig
 from synapse.http.servlet import parse_boolean
+from synapse.streams.config import PaginationConfig
 
 from .base import ClientV1RestServlet, client_path_patterns
 
diff --git a/synapse/rest/client/v2_alpha/devices.py b/synapse/rest/client/v2_alpha/devices.py
index aded2409be5a7624843be6feef3e55142c2255b7..9b75bb1377484b62c2c76eb67d1e76c532400f51 100644
--- a/synapse/rest/client/v2_alpha/devices.py
+++ b/synapse/rest/client/v2_alpha/devices.py
@@ -19,9 +19,9 @@ from twisted.internet import defer
 
 from synapse.api import errors
 from synapse.http.servlet import (
+    RestServlet,
     assert_params_in_dict,
     parse_json_object_from_request,
-    RestServlet
 )
 
 from ._base import client_v2_patterns, interactive_auth_handler
diff --git a/synapse/rest/media/v1/identicon_resource.py b/synapse/rest/media/v1/identicon_resource.py
index b3217eff538b6895d26176937fcfae3244644dee..bdbd8d50dd474b173752c8fc8dd3c7a021bf2be6 100644
--- a/synapse/rest/media/v1/identicon_resource.py
+++ b/synapse/rest/media/v1/identicon_resource.py
@@ -14,10 +14,10 @@
 
 from pydenticon import Generator
 
-from synapse.http.servlet import parse_integer
-
 from twisted.web.resource import Resource
 
+from synapse.http.servlet import parse_integer
+
 FOREGROUND = [
     "rgb(45,79,255)",
     "rgb(254,180,44)",
diff --git a/tox.ini b/tox.ini
index 61a20a10cb14d4b05dd43747d81f7b18c88fd48f..ed26644bd9227cdac0258ecc6a08cd403793b3eb 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = packaging, py27, py36, pep8
+envlist = packaging, py27, py36, pep8, check_isort
 
 [testenv]
 deps =
@@ -103,10 +103,14 @@ deps =
     flake8
 commands = /bin/sh -c "flake8 synapse tests {env:PEP8SUFFIX:}"
 
+[testenv:check_isort]
+skip_install = True
+deps = isort
+commands = /bin/sh -c "isort -c -sp setup.cfg -rc synapse tests"
 
 [testenv:check-newsfragment]
 skip_install = True
 deps = towncrier>=18.6.0rc1
 commands =
    python -m towncrier.check --compare-with=origin/develop
-basepython = python3.6
\ No newline at end of file
+basepython = python3.6