diff --git a/openedx/core/djangoapps/user_api/tests/test_views.py b/openedx/core/djangoapps/user_api/tests/test_views.py
index 8f31738eb82dba66bee19dbe78c689da4a32b49d..3fe8a429104879d7fb61b614a4dbd7e9ebaed24e 100644
--- a/openedx/core/djangoapps/user_api/tests/test_views.py
+++ b/openedx/core/djangoapps/user_api/tests/test_views.py
@@ -2718,7 +2718,7 @@ class CountryTimeZoneListViewTest(UserApiTestCase):
         self.assertEqual(time_zone_info['description'], get_display_time_zone(time_zone_name))
 
     # The time zones count may need to change each time we upgrade pytz
-    @ddt.data((ALL_TIME_ZONES_URI, 439),
+    @ddt.data((ALL_TIME_ZONES_URI, 440),
               (COUNTRY_TIME_ZONES_URI, 28))
     @ddt.unpack
     def test_get_basic(self, country_uri, expected_count):
diff --git a/pavelib/paver_tests/test_paver_pytest_cmds.py b/pavelib/paver_tests/test_paver_pytest_cmds.py
index 70dd8494aafc100d37b70f50d6f5ca92e56b76e1..9a25f15c5a1c9695b7555acdd44ba798cbadea63 100644
--- a/pavelib/paver_tests/test_paver_pytest_cmds.py
+++ b/pavelib/paver_tests/test_paver_pytest_cmds.py
@@ -75,12 +75,7 @@ class TestPaverPytestCmd(unittest.TestCase):
         ])
 
         if run_under_coverage:
-            if xdist_ip_addresses:
-                for module in Env.covered_modules():
-                    expected_statement.append('--cov')
-                    expected_statement.append(module)
-            else:
-                expected_statement.append('--cov')
+            expected_statement.append('--cov')
             expected_statement.append('--cov-report=')
         return expected_statement
 
diff --git a/pavelib/utils/test/suites/pytest_suite.py b/pavelib/utils/test/suites/pytest_suite.py
index e814e75608aa23fb73532ffda993766b3eeb4a06..5fb755bc90d488d0f42ace2cca39b2ad2c51dca5 100644
--- a/pavelib/utils/test/suites/pytest_suite.py
+++ b/pavelib/utils/test/suites/pytest_suite.py
@@ -126,12 +126,7 @@ class SystemTestSuite(PytestSuite):
         unaltered otherwise.
         """
         if self.run_under_coverage:
-            if self.xdist_ip_addresses:
-                for module in Env.covered_modules():
-                    cmd.append('--cov')
-                    cmd.append(module)
-            else:
-                cmd.append('--cov')
+            cmd.append('--cov')
             cmd.append('--cov-report=')
 
         return cmd
@@ -320,12 +315,7 @@ class LibTestSuite(PytestSuite):
         unaltered otherwise.
         """
         if self.run_under_coverage:
-            if self.xdist_ip_addresses:
-                for module in Env.covered_modules():
-                    cmd.append('--cov')
-                    cmd.append(module)
-            else:
-                cmd.append('--cov')
+            cmd.append('--cov')
             if self.append_coverage:
                 cmd.append('--cov-append')
             cmd.append('--cov-report=')
diff --git a/requirements/constraints.txt b/requirements/constraints.txt
index 105781d2809c7b34159cd35350282013fd9a4672..5685efa0c33e89db62f85feac342de1c692395f3 100644
--- a/requirements/constraints.txt
+++ b/requirements/constraints.txt
@@ -15,16 +15,10 @@ six==1.11.0
 # Convert text markup to HTML; used in capa problems, forums, and course wikis; pin Markdown version as tests failed for its upgrade to latest release
 Markdown==2.6.11
 
-# 5.4.0 causes cms/djangoapps/api/v1/tests/test_views/test_course_runs.py::CourseRunViewSetTests::test_images_upload to fail
-pillow==5.3.0
-
 # required by edx-lint and pinned explicitly here because newer versions don't guarantee python 2 support.
 # Can be removed when we get to Python 3.
 pylint-plugin-utils==0.3
 
-# pytest plugin for measuring code coverage. # Pinned due to https://openedx.atlassian.net/browse/TE-2731
-pytest-cov<2.6
-
 # Browser driver used by lettuce - pinned because splinter==0.10.0 breaks lettuce tests.  EDUCATOR-3795
 splinter==0.9.0
 
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index a7b49c713997c91c4b9e96d4555368083347f967..ec7f334189baf7b8323fe94913ceb017015e4ca7 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -51,7 +51,7 @@ asn1crypto==0.24.0
 attrs==17.4.0
 babel==1.3
 backports.functools-lru-cache==1.5  # via soupsieve
-beautifulsoup4==4.7.0     # via pynliner
+beautifulsoup4==4.7.1     # via pynliner
 billiard==3.3.0.23        # via celery
 bleach==2.1.4
 boto3==1.4.8
@@ -183,7 +183,7 @@ paver==1.3.4
 pbr==5.1.1
 pdfminer==20140328
 piexif==1.0.2
-pillow==5.3.0
+pillow==5.4.1
 polib==1.1.0              # via edx-i18n-tools
 psutil==1.2.1
 py2neo==3.1.2
@@ -205,7 +205,7 @@ python-memcached==1.48
 python-openid==2.2.5
 python-saml==2.4.0
 python-swiftclient==3.6.0
-pytz==2018.7
+pytz==2018.9
 pyuca==1.1
 pyyaml==3.13
 redis==2.10.6
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 972cb386d388b1ddcd73381d716e0e5dda328261..526e7f29a20317b534f4f2c4f23ec725bd610597 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -58,7 +58,7 @@ atomicwrites==1.2.1
 attrs==17.4.0
 babel==1.3
 backports.functools-lru-cache==1.5
-beautifulsoup4==4.7.0
+beautifulsoup4==4.7.1
 before-after==1.0.1
 billiard==3.3.0.23
 bleach==2.1.4
@@ -234,7 +234,7 @@ paver==1.3.4
 pbr==5.1.1
 pdfminer==20140328
 piexif==1.0.2
-pillow==5.3.0
+pillow==5.4.1
 pip-tools==3.2.0
 pluggy==0.8.0
 polib==1.1.0
@@ -267,12 +267,12 @@ pyquery==1.4.0
 pysqlite==2.8.3
 pysrt==1.1.1
 pytest-attrib==0.1.3
-pytest-cov==2.5.1
-pytest-django==3.1.2
+pytest-cov==2.6.1
+pytest-django==3.4.5
 pytest-forked==0.2
 pytest-randomly==1.2.3
 pytest-xdist==1.25.0
-pytest==4.0.2
+pytest==4.1.0
 python-dateutil==2.4.0
 python-levenshtein==0.12.0
 python-memcached==1.48
@@ -282,7 +282,7 @@ python-saml==2.4.0
 python-slugify==1.2.6
 python-subunit==1.3.0
 python-swiftclient==3.6.0
-pytz==2018.7
+pytz==2018.9
 pyuca==1.1
 pyyaml==3.13
 queuelib==1.5.0
diff --git a/requirements/edx/testing.in b/requirements/edx/testing.in
index 329ffe9788f4d27a8ba33cfd7c409fcd2b6de74d..cb63e2fe57aa026b5bfa510cc00670bc79df8678 100644
--- a/requirements/edx/testing.in
+++ b/requirements/edx/testing.in
@@ -37,7 +37,7 @@ pysqlite                  # DB-API 2.0 interface for SQLite 3.x (used as the rel
 pytest                    # Testing framework
 pytest-attrib             # Select tests based on attributes
 pytest-cov                # pytest plugin for measuring code coverage.
-pytest-django==3.1.2      # Django support for pytest
+pytest-django             # Django support for pytest
 pytest-randomly           # pytest plugin to randomly order tests
 pytest-xdist              # Parallel execution of tests on multiple CPU cores or hosts
 radon                     # Calculates cyclomatic complexity of Python code (code quality utility)
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 68b11e23c4ace187961c118504afb7403dfa9b72..2bd47d42de9ff05e26fa4528b674d2a3c1bcf167 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -55,7 +55,7 @@ atomicwrites==1.2.1       # via pytest
 attrs==17.4.0
 babel==1.3
 backports.functools-lru-cache==1.5
-beautifulsoup4==4.7.0
+beautifulsoup4==4.7.1
 before-after==1.0.1
 billiard==3.3.0.23
 bleach==2.1.4
@@ -219,13 +219,13 @@ openapi-codec==1.3.2
 pa11ycrawler==1.6.2
 parsel==1.5.1             # via scrapy
 path.py==8.2.1
-pathlib2==2.3.3           # via pytest
+pathlib2==2.3.3           # via pytest, pytest-django
 pathtools==0.1.2
 paver==1.3.4
 pbr==5.1.1
 pdfminer==20140328
 piexif==1.0.2
-pillow==5.3.0
+pillow==5.4.1
 pluggy==0.8.0             # via pytest, tox
 polib==1.1.0
 psutil==1.2.1
@@ -256,12 +256,12 @@ pyquery==1.4.0
 pysqlite==2.8.3
 pysrt==1.1.1
 pytest-attrib==0.1.3
-pytest-cov==2.5.1
-pytest-django==3.1.2
+pytest-cov==2.6.1
+pytest-django==3.4.5
 pytest-forked==0.2        # via pytest-xdist
 pytest-randomly==1.2.3
 pytest-xdist==1.25.0
-pytest==4.0.2
+pytest==4.1.0
 python-dateutil==2.4.0
 python-levenshtein==0.12.0
 python-memcached==1.48
@@ -271,7 +271,7 @@ python-saml==2.4.0
 python-slugify==1.2.6     # via transifex-client
 python-subunit==1.3.0
 python-swiftclient==3.6.0
-pytz==2018.7
+pytz==2018.9
 pyuca==1.1
 pyyaml==3.13
 queuelib==1.5.0           # via scrapy
diff --git a/scripts/unit-tests.sh b/scripts/unit-tests.sh
index cfe01d3fafa01a3e070fe50f8806fb2abf51f5fd..938708c8acff0ae580ef2159e4e58d5410c90319 100755
--- a/scripts/unit-tests.sh
+++ b/scripts/unit-tests.sh
@@ -56,12 +56,15 @@ case "${TEST_SUITE}" in
         case "$SHARD" in
             "all")
                 paver test_system -s lms --disable_capture ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.log
+                mv reports/.coverage reports/.coverage.lms
                 ;;
             [1-9])
                 paver test_system -s lms --disable_capture --eval-attr="shard==$SHARD" ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.${SHARD}.log
+                mv reports/.coverage reports/.coverage.lms.${SHARD}
                 ;;
             10|"noshard")
                 paver test_system -s lms --disable_capture --eval-attr="shard>=$SHARD or not shard" ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.10.log
+                mv reports/.coverage reports/.coverage.lms.10
                 ;;
             *)
                 # If no shard is specified, rather than running all tests, create an empty xunit file. This is a
@@ -78,12 +81,15 @@ case "${TEST_SUITE}" in
         case "$SHARD" in
             "all")
                 paver test_system -s cms --disable_capture ${PAVER_ARGS} ${PARALLEL} 2> cms-tests.log
+                mv reports/.coverage reports/.coverage.cms
                 ;;
             1)
                 paver test_system -s cms --disable_capture --eval-attr="shard==$SHARD" ${PAVER_ARGS} 2> cms-tests.${SHARD}.log
+                mv reports/.coverage reports/.coverage.cms.${SHARD}
                 ;;
             2|"noshard")
                 paver test_system -s cms --disable_capture --eval-attr="shard>=$SHARD or not shard" ${PAVER_ARGS} 2> cms-tests.2.log
+                mv reports/.coverage reports/.coverage.cms.2
                 ;;
             *)
                 # If no shard is specified, rather than running all tests, create an empty xunit file. This is a
@@ -100,12 +106,15 @@ case "${TEST_SUITE}" in
         case "$SHARD" in
             "all")
                 paver test_lib --disable_capture ${PAVER_ARGS} ${PARALLEL} 2> common-tests.log
+                mv reports/.coverage reports/.coverage.commonlib
                 ;;
             [1-2])
                 paver test_lib -l common/lib/xmodule --disable_capture --eval-attr="shard==$SHARD" ${PAVER_ARGS} 2> common-tests.${SHARD}.log
+                mv reports/.coverage reports/.coverage.commonlib.${SHARD}
                 ;;
             3|"noshard")
                 paver test_lib --disable_capture --eval-attr="shard>=$SHARD or not shard" ${PAVER_ARGS} 2> common-tests.3.log
+                mv reports/.coverage reports/.coverage.commonlib.3
                 ;;
             *)
                 # If no shard is specified, rather than running all tests, create an empty xunit file. This is a