diff --git a/cms/djangoapps/pipeline_js/utils.py b/cms/djangoapps/pipeline_js/utils.py
index 91ce32d8af93ddeb80ad03f863ef49eb4ced1577..ba00cd199defb91b0f500737135743ce0e5f85f5 100644
--- a/cms/djangoapps/pipeline_js/utils.py
+++ b/cms/djangoapps/pipeline_js/utils.py
@@ -10,7 +10,7 @@ def get_xmodule_urls():
     """
     Returns a list of the URLs to hit to grab all the XModule JS
     """
-    pipeline_js_settings = settings.PIPELINE_JS["module-js"]
+    pipeline_js_settings = settings.PIPELINE['JAVASCRIPT']["module-js"]
     if settings.DEBUG:
         paths = [path.replace(".coffee", ".js") for path in pipeline_js_settings["source_filenames"]]
     else:
diff --git a/cms/envs/common.py b/cms/envs/common.py
index 3c3e6bb67e478c353a828d49c6ba3829733d7123..16900f5fa3ab096b0e190a4a8aeaf5a37ff16561 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -702,7 +702,18 @@ EMBARGO_SITE_REDIRECT_URL = None
 
 ############################### PIPELINE #######################################
 
-PIPELINE_ENABLED = True
+PIPELINE = {
+    'PIPELINE_ENABLED': True,
+    # Don't use compression by default
+    'CSS_COMPRESSOR': None,
+    'JS_COMPRESSOR': None,
+    # Don't wrap JavaScript as there is code that depends upon updating the global namespace
+    'DISABLE_WRAPPER': True,
+    # Specify the UglifyJS binary to use
+    'UGLIFYJS_BINARY': 'node_modules/.bin/uglifyjs',
+    'COMPILERS': (),
+    'YUI_BINARY': 'yui-compressor',
+}
 
 STATICFILES_STORAGE = 'openedx.core.storage.ProductionStorage'
 
@@ -716,19 +727,9 @@ STATICFILES_FINDERS = [
     'pipeline.finders.PipelineFinder',
 ]
 
-# Don't use compression by default
-PIPELINE_CSS_COMPRESSOR = None
-PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.uglifyjs.UglifyJSCompressor'
-
-# Don't wrap JavaScript as there is code that depends upon updating the global namespace
-PIPELINE_DISABLE_WRAPPER = True
-
-# Specify the UglifyJS binary to use
-PIPELINE_UGLIFYJS_BINARY = 'node_modules/.bin/uglifyjs'
-
 from openedx.core.lib.rooted_paths import rooted_glob
 
-PIPELINE_CSS = {
+PIPELINE['STYLESHEETS'] = {
     'style-vendor': {
         'source_filenames': [
             'css/vendor/normalize.css',
@@ -826,7 +827,7 @@ base_vendor_js = [
 
 # test_order: Determines the position of this chunk of javascript on
 # the jasmine test page
-PIPELINE_JS = {
+PIPELINE['JAVASCRIPT'] = {
     'base_vendor': {
         'source_filenames': base_vendor_js,
         'output_filename': 'js/cms-base-vendor.js',
@@ -842,10 +843,6 @@ PIPELINE_JS = {
     },
 }
 
-PIPELINE_COMPILERS = ()
-PIPELINE_CSS_COMPRESSOR = None
-PIPELINE_JS_COMPRESSOR = None
-
 STATICFILES_IGNORE_PATTERNS = (
     "*.py",
     "*.pyc",
@@ -868,8 +865,6 @@ STATICFILES_IGNORE_PATTERNS = (
     "common_static",
 )
 
-PIPELINE_YUI_BINARY = 'yui-compressor'
-
 ################################# DJANGO-REQUIRE ###############################
 
 
diff --git a/cms/envs/devstack.py b/cms/envs/devstack.py
index 938e2c72d894a5d5bfc0fc95c9b92b4ed323ae13..edc70d1c75a244b538f5fd16014a27f9cc839183 100644
--- a/cms/envs/devstack.py
+++ b/cms/envs/devstack.py
@@ -40,7 +40,7 @@ FEATURES['PREVIEW_LMS_BASE'] = "preview." + LMS_BASE
 ########################### PIPELINE #################################
 
 # Skip packaging and optimization in development
-PIPELINE_ENABLED = False
+PIPELINE['PIPELINE_ENABLED'] = False
 STATICFILES_STORAGE = 'openedx.core.storage.DevelopmentStorage'
 
 # Revert to the default set of finders as we don't want the production pipeline
diff --git a/common/djangoapps/pipeline_mako/__init__.py b/common/djangoapps/pipeline_mako/__init__.py
index 754976d5099eadf55e85af47bdf28c125b0c1d83..1773426519059866b9e5a0395cae8eb9f02632a0 100644
--- a/common/djangoapps/pipeline_mako/__init__.py
+++ b/common/djangoapps/pipeline_mako/__init__.py
@@ -10,7 +10,7 @@ from django.contrib.staticfiles.storage import staticfiles_storage
 
 
 def compressed_css(package_name, raw=False):
-    package = settings.PIPELINE_CSS.get(package_name, {})
+    package = settings.STYLESHEETS.get(package_name, {})
     if package:
         package = {package_name: package}
     packager = Packager(css_packages=package, js_packages={})
@@ -44,7 +44,7 @@ def render_individual_css(package, paths, raw=False):
 
 
 def compressed_js(package_name):
-    package = settings.PIPELINE_JS.get(package_name, {})
+    package = settings.JAVASCRIPT.get(package_name, {})
     if package:
         package = {package_name: package}
     packager = Packager(css_packages={}, js_packages=package)
diff --git a/common/djangoapps/pipeline_mako/templates/static_content.html b/common/djangoapps/pipeline_mako/templates/static_content.html
index da6868b8abbd7d46ebc85c655b295fdcb63ea2d5..afa7fbab8ee6a4b70f1c17b611bc4f641a4fbed3 100644
--- a/common/djangoapps/pipeline_mako/templates/static_content.html
+++ b/common/djangoapps/pipeline_mako/templates/static_content.html
@@ -50,24 +50,24 @@ except:
   <%
       rtl_group = '{}-rtl'.format(group)
 
-      if get_language_bidi() and rtl_group in settings.PIPELINE_CSS:
+      if get_language_bidi() and rtl_group in settings.PIPELINE['STYLESHEETS']:
         group = rtl_group
   %>
 
-  % if settings.PIPELINE_ENABLED:
+  % if settings.PIPELINE['PIPELINE_ENABLED']:
     ${compressed_css(group, raw=raw) | n, decode.utf8}
   % else:
-    % for filename in settings.PIPELINE_CSS[group]['source_filenames']:
+    % for filename in settings.PIPELINE['STYLESHEETS'][group]['source_filenames']:
       <link rel="stylesheet" href="${staticfiles_storage.url(filename.replace('.scss', '.css'))}${"?raw" if raw else ""}" type="text/css" media="all" / >
     % endfor
   %endif
 </%def>
 
 <%def name='js(group)'>
-  % if settings.PIPELINE_ENABLED:
+  % if settings.PIPELINE['PIPELINE_ENABLED']:
     ${compressed_js(group) | n, decode.utf8}
   % else:
-    % for filename in settings.PIPELINE_JS[group]['source_filenames']:
+    % for filename in settings.PIPELINE['JAVASCRIPT'][group]['source_filenames']:
       <script type="text/javascript" src="${staticfiles_storage.url(filename.replace('.coffee', '.js'))}"></script>
     % endfor
   %endif
diff --git a/common/djangoapps/pipeline_mako/tests/test_render.py b/common/djangoapps/pipeline_mako/tests/test_render.py
index 7ac231a60a7a0e822035af24fbfbe6d88a9c0f09..77af65939b1579e8009132dc5d22d495a5316f50 100644
--- a/common/djangoapps/pipeline_mako/tests/test_render.py
+++ b/common/djangoapps/pipeline_mako/tests/test_render.py
@@ -58,7 +58,9 @@ class PipelineRenderTest(TestCase):
         Verify the behavior of compressed_css, with the pipeline
         both enabled and disabled.
         """
-        with self.settings(PIPELINE_ENABLED=pipeline_enabled):
+        pipeline = settings.PIPELINE.copy()
+        pipeline['PIPELINE_ENABLED'] = pipeline_enabled
+        with self.settings(PIPELINE=pipeline):
             # Verify the default behavior
             css_include = compressed_css('style-main-v1')
             self.assertIn(u'lms-main-v1.css', css_include)
@@ -74,12 +76,15 @@ class PipelineRenderTest(TestCase):
         Verify the behavior of compressed_css, with the pipeline
         both enabled and disabled.
         """
+        pipeline = settings.PIPELINE.copy()
         # Verify that a single JS file is rendered with the pipeline enabled
-        with self.settings(PIPELINE_ENABLED=True):
+        pipeline['PIPELINE_ENABLED'] = True
+        with self.settings(PIPELINE=pipeline):
             js_include = compressed_js('base_application')
             self.assertIn(u'lms-base-application.js', js_include)
 
         # Verify that multiple JS files are rendered with the pipeline disabled
-        with self.settings(PIPELINE_ENABLED=False):
+        pipeline['PIPELINE_ENABLED'] = False
+        with self.settings(PIPELINE=pipeline):
             js_include = compressed_js('base_application')
             self.assertIn(u'/static/js/src/logger.js', js_include)
diff --git a/lms/djangoapps/branding/views.py b/lms/djangoapps/branding/views.py
index d5cb206036c37411ee1a6c1c8f048dec5d788f3c..67735445c1ac77d45614da0bb993d8c549d212b9 100644
--- a/lms/djangoapps/branding/views.py
+++ b/lms/djangoapps/branding/views.py
@@ -105,7 +105,7 @@ def _footer_css_urls(request, package_name):
     # to identify the CSS file name(s) to include in the footer.
     # We then construct an absolute URI so that external sites (such as the marketing site)
     # can locate the assets.
-    package = settings.PIPELINE_CSS.get(package_name, {})
+    package = settings.PIPELINE['STYLESHEETS'].get(package_name, {})
     paths = [package['output_filename']] if not settings.DEBUG else package['source_filenames']
     return [
         _footer_static_url(request, path)
diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py
index d2593cc7086f3daf013412a974661317dbb104b4..1d19a45624d9622e811e574fc5648b0a407d80bb 100644
--- a/lms/envs/bok_choy.py
+++ b/lms/envs/bok_choy.py
@@ -80,7 +80,7 @@ MEDIA_ROOT = TEST_ROOT / "uploads"
 WEBPACK_LOADER['DEFAULT']['STATS_FILE'] = TEST_ROOT / "staticfiles" / "lms" / "webpack-stats.json"
 
 # Don't use compression during tests
-PIPELINE_JS_COMPRESSOR = None
+PIPELINE['JS_COMPRESSOR'] = None
 
 ################################# CELERY ######################################
 
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 01c985b3fe398bbf140966a67f42d8fb7ddfaabc..c5471478ddf242808c98d03ca4934b28ca3b881a 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -1336,7 +1336,15 @@ P3P_HEADER = 'CP="Open EdX does not have a P3P policy."'
 
 ############################### PIPELINE #######################################
 
-PIPELINE_ENABLED = True
+PIPELINE = {
+    'PIPELINE_ENABLED': True,
+    'CSS_COMPRESSOR': None,
+    'JS_COMPRESSOR': 'pipeline.compressors.uglifyjs.UglifyJSCompressor',
+    # Don't wrap JavaScript as there is code that depends upon updating the global namespace
+    'DISABLE_WRAPPER': True,
+    # Specify the UglifyJS binary to use
+    'UGLIFYJS_BINARY': 'node_modules/.bin/uglifyjs',
+}
 
 STATICFILES_STORAGE = 'openedx.core.storage.ProductionStorage'
 
@@ -1350,15 +1358,6 @@ STATICFILES_FINDERS = [
     'pipeline.finders.PipelineFinder',
 ]
 
-PIPELINE_CSS_COMPRESSOR = None
-PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.uglifyjs.UglifyJSCompressor'
-
-# Don't wrap JavaScript as there is code that depends upon updating the global namespace
-PIPELINE_DISABLE_WRAPPER = True
-
-# Specify the UglifyJS binary to use
-PIPELINE_UGLIFYJS_BINARY = 'node_modules/.bin/uglifyjs'
-
 from openedx.core.lib.rooted_paths import rooted_glob
 
 courseware_js = [
@@ -1504,7 +1503,7 @@ credit_web_view_js = [
     'js/src/logger.js',
 ]
 
-PIPELINE_CSS = {
+PIPELINE['STYLESHEETS'] = {
     'style-vendor': {
         'source_filenames': [
             'css/vendor/font-awesome.css',
@@ -1678,7 +1677,7 @@ lms_application_js = [
     'js/main.js',
 ]
 
-PIPELINE_JS = {
+PIPELINE['JAVASCRIPT'] = {
     'base_application': {
         'source_filenames': base_application_js,
         'output_filename': 'js/lms-base-application.js',
diff --git a/lms/envs/devstack.py b/lms/envs/devstack.py
index e7f737a4ae9595727fd04a43da64de3f6648c747..fdad39946d9408e9a71009414bd8d75ac06ff5bc 100644
--- a/lms/envs/devstack.py
+++ b/lms/envs/devstack.py
@@ -99,7 +99,7 @@ FEATURES['ENABLE_API_DOCS'] = True
 
 ########################### PIPELINE #################################
 
-PIPELINE_ENABLED = False
+PIPELINE['PIPELINE_ENABLED'] = False
 STATICFILES_STORAGE = 'openedx.core.storage.DevelopmentStorage'
 
 # Revert to the default set of finders as we don't want the production pipeline
@@ -110,12 +110,12 @@ STATICFILES_FINDERS = [
 ]
 
 # Disable JavaScript compression in development
-PIPELINE_JS_COMPRESSOR = None
+PIPELINE['JS_COMPRESSOR'] = None
 
 # Whether to run django-require in debug mode.
 REQUIRE_DEBUG = DEBUG
 
-PIPELINE_SASS_ARGUMENTS = '--debug-info'
+PIPELINE['SASS_ARGUMENTS'] = '--debug-info'
 
 # Load development webpack donfiguration
 WEBPACK_CONFIG_PATH = 'webpack.dev.config.js'
diff --git a/lms/envs/test.py b/lms/envs/test.py
index 80754cf12712edd51fbf310a7878fb4a1a5f8a13..af02d1e50aa6fa0a1af30ef7e45465afbee630b6 100644
--- a/lms/envs/test.py
+++ b/lms/envs/test.py
@@ -145,7 +145,7 @@ STATICFILES_DIRS += [
 STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'
 
 # Don't use compression during tests
-PIPELINE_JS_COMPRESSOR = None
+PIPELINE['JS_COMPRESSOR'] = None
 
 update_module_store_settings(
     MODULESTORE,
diff --git a/openedx/core/djangoapps/plugin_api/views.py b/openedx/core/djangoapps/plugin_api/views.py
index b8b4b1c74367d3f51448a032451a3bb77c478ab8..1214f27665626ca23127e49a0e74d64e678c95c1 100644
--- a/openedx/core/djangoapps/plugin_api/views.py
+++ b/openedx/core/djangoapps/plugin_api/views.py
@@ -26,26 +26,26 @@ class EdxFragmentView(FragmentView):
     @staticmethod
     def get_css_dependencies(group):
         """
-        Returns list of CSS dependencies belonging to `group` in settings.PIPELINE_JS.
+        Returns list of CSS dependencies belonging to `group` in settings.PIPELINE['JAVASCRIPT'].
 
-        Respects `PIPELINE_ENABLED` setting.
+        Respects `PIPELINE['PIPELINE_ENABLED']` setting.
         """
-        if settings.PIPELINE_ENABLED:
-            return [settings.PIPELINE_CSS[group]['output_filename']]
+        if settings.PIPELINE['PIPELINE_ENABLED']:
+            return [settings.PIPELINE['STYLESHEETS'][group]['output_filename']]
         else:
-            return settings.PIPELINE_CSS[group]['source_filenames']
+            return settings.PIPELINE['STYLESHEETS'][group]['source_filenames']
 
     @staticmethod
     def get_js_dependencies(group):
         """
-        Returns list of JS dependencies belonging to `group` in settings.PIPELINE_JS.
+        Returns list of JS dependencies belonging to `group` in settings.PIPELINE['JAVASCRIPT'].
 
-        Respects `PIPELINE_ENABLED` setting.
+        Respects `PIPELINE['PIPELINE_ENABLED']` setting.
         """
-        if settings.PIPELINE_ENABLED:
-            return [settings.PIPELINE_JS[group]['output_filename']]
+        if settings.PIPELINE['PIPELINE_ENABLED']:
+            return [settings.PIPELINE['JAVASCRIPT'][group]['output_filename']]
         else:
-            return settings.PIPELINE_JS[group]['source_filenames']
+            return settings.PIPELINE['JAVASCRIPT'][group]['source_filenames']
 
     def vendor_js_dependencies(self):
         """
diff --git a/openedx/core/djangoapps/theming/storage.py b/openedx/core/djangoapps/theming/storage.py
index d128c65b12dd750f949f1ca24343ab770501cb43..268b80b52b30fe0a629272ac91bcf80b28ca9ccb 100644
--- a/openedx/core/djangoapps/theming/storage.py
+++ b/openedx/core/djangoapps/theming/storage.py
@@ -275,7 +275,7 @@ class ThemePipelineMixin(PipelineMixin):
         themes = get_themes()
 
         for theme in themes:
-            css_packages = self.get_themed_packages(theme.theme_dir_name, settings.PIPELINE_CSS)
+            css_packages = self.get_themed_packages(theme.theme_dir_name, settings.PIPELINE['STYLESHEETS'])
 
             from pipeline.packager import Packager
             packager = Packager(storage=self, css_packages=css_packages)
diff --git a/openedx/core/djangoapps/theming/templatetags/theme_pipeline.py b/openedx/core/djangoapps/theming/templatetags/theme_pipeline.py
index d3e37e4187eb08a983f963ea0f6482406b8d92b7..1dc3ec4d3d2d2a321b062de4ea362a5d20a2a93a 100644
--- a/openedx/core/djangoapps/theming/templatetags/theme_pipeline.py
+++ b/openedx/core/djangoapps/theming/templatetags/theme_pipeline.py
@@ -57,7 +57,7 @@ def stylesheet(parser, token):  # pylint: disable=unused-argument
         _, name = token.split_contents()
     except ValueError:
         raise template.TemplateSyntaxError(
-            u'%r requires exactly one argument: the name of a group in the PIPELINE_CSS setting' %
+            u'%r requires exactly one argument: the name of a group in the PIPELINE["STYLESHEETS"] setting' %
             token.split_contents()[0]
         )
     return ThemeStylesheetNode(name)
@@ -72,7 +72,7 @@ def javascript(parser, token):  # pylint: disable=unused-argument
         _, name = token.split_contents()
     except ValueError:
         raise template.TemplateSyntaxError(
-            u'%r requires exactly one argument: the name of a group in the PIPELINE_JS setting' %
+            u'%r requires exactly one argument: the name of a group in the PIPELINE["JAVASCRIPT"] setting' %
             token.split_contents()[0]
         )
     return ThemeJavascriptNode(name)
diff --git a/openedx/core/lib/tests/test_xblock_utils.py b/openedx/core/lib/tests/test_xblock_utils.py
index a093093a7773e73ab83e7db3d70548642b7d5313..1e75368f7d86347bbfdfa77fb1d9758c543fb796 100644
--- a/openedx/core/lib/tests/test_xblock_utils.py
+++ b/openedx/core/lib/tests/test_xblock_utils.py
@@ -6,6 +6,7 @@ from __future__ import absolute_import, unicode_literals
 import uuid
 
 import ddt
+from django.conf import settings
 from django.test.client import RequestFactory
 from mock import patch
 from web_fragments.fragment import Fragment
@@ -194,13 +195,15 @@ class TestXblockUtils(SharedModuleStoreTestCase):
         """
         Verify that `get_css_dependencies` returns correct list of files.
         """
-        pipeline_css = {
+        pipeline = settings.PIPELINE.copy()
+        pipeline['PIPELINE_ENABLED'] = pipeline_enabled
+        pipeline['STYLESHEETS'] = {
             'style-group': {
                 'source_filenames': ["a.css", "b.css", "c.css"],
                 'output_filename': "combined.css"
             }
         }
-        with self.settings(PIPELINE_ENABLED=pipeline_enabled, PIPELINE_CSS=pipeline_css):
+        with self.settings(PIPELINE=pipeline):
             css_dependencies = get_css_dependencies("style-group")
             self.assertEqual(css_dependencies, expected_css_dependencies)
 
@@ -213,13 +216,15 @@ class TestXblockUtils(SharedModuleStoreTestCase):
         """
         Verify that `get_js_dependencies` returns correct list of files.
         """
-        pipeline_js = {
+        pipeline = settings.PIPELINE.copy()
+        pipeline['PIPELINE_ENABLED'] = pipeline_enabled
+        pipeline['JAVASCRIPT'] = {
             'js-group': {
                 'source_filenames': ["a.js", "b.js", "c.js"],
                 'output_filename': "combined.js"
             }
         }
-        with self.settings(PIPELINE_ENABLED=pipeline_enabled, PIPELINE_JS=pipeline_js):
+        with self.settings(PIPELINE=pipeline):
             js_dependencies = get_js_dependencies("js-group")
             self.assertEqual(js_dependencies, expected_js_dependencies)
 
diff --git a/openedx/core/lib/xblock_builtin/__init__.py b/openedx/core/lib/xblock_builtin/__init__.py
index 643ebb525524e4692b10817ce77d7b81ef861be4..5414ba274012d083cdfdf93d718caf2db3048903 100644
--- a/openedx/core/lib/xblock_builtin/__init__.py
+++ b/openedx/core/lib/xblock_builtin/__init__.py
@@ -10,23 +10,23 @@ from django.conf import settings
 
 def get_css_dependencies(group):
     """
-    Returns list of CSS dependencies belonging to `group` in settings.PIPELINE_JS.
+    Returns list of CSS dependencies belonging to `group` in settings.PIPELINE['STYLESHEETS'].
 
-    Respects `PIPELINE_ENABLED` setting.
+    Respects `PIPELINE['PIPELINE_ENABLED']` setting.
     """
-    if settings.PIPELINE_ENABLED:
-        return [settings.PIPELINE_CSS[group]['output_filename']]
+    if settings.PIPELINE['PIPELINE_ENABLED']:
+        return [settings.PIPELINE['STYLESHEETS'][group]['output_filename']]
     else:
-        return settings.PIPELINE_CSS[group]['source_filenames']
+        return settings.PIPELINE['STYLESHEETS'][group]['source_filenames']
 
 
 def get_js_dependencies(group):
     """
-    Returns list of JS dependencies belonging to `group` in settings.PIPELINE_JS.
+    Returns list of JS dependencies belonging to `group` in settings.PIPELINE['JAVASCRIPT'].
 
-    Respects `PIPELINE_ENABLED` setting.
+    Respects `PIPELINE['PIPELINE_ENABLED']` setting.
     """
-    if settings.PIPELINE_ENABLED:
-        return [settings.PIPELINE_JS[group]['output_filename']]
+    if settings.PIPELINE['PIPELINE_ENABLED']:
+        return [settings.PIPELINE['JAVASCRIPT'][group]['output_filename']]
     else:
-        return settings.PIPELINE_JS[group]['source_filenames']
+        return settings.PIPELINE['JAVASCRIPT'][group]['source_filenames']
diff --git a/openedx/core/lib/xblock_utils/__init__.py b/openedx/core/lib/xblock_utils/__init__.py
index 8eb0728dadd9793bce1526d32502b3a87217949a..edef41abfd3b2b59ef0bf80cf07da6648185bb07 100644
--- a/openedx/core/lib/xblock_utils/__init__.py
+++ b/openedx/core/lib/xblock_utils/__init__.py
@@ -485,7 +485,7 @@ def xblock_local_resource_url(block, uri):
     as a static asset which will use a CDN in production.
     """
     xblock_class = getattr(block.__class__, 'unmixed_class', block.__class__)
-    if settings.PIPELINE_ENABLED or not settings.REQUIRE_DEBUG:
+    if settings.PIPELINE['PIPELINE_ENABLED'] or not settings.REQUIRE_DEBUG:
         return staticfiles_storage.url('xblock/resources/{package_name}/{path}'.format(
             package_name=xblock_resource_pkg(xblock_class),
             path=uri
diff --git a/requirements/edx/base.in b/requirements/edx/base.in
index aa994d0ac9cd1d91936215455ca58797640c52e8..4060288d80b8381beeaa36aa9f068e2458919731 100644
--- a/requirements/edx/base.in
+++ b/requirements/edx/base.in
@@ -49,7 +49,7 @@ django-model-utils==3.0.0
 django-mptt>=0.8.6,<0.9
 django-mysql==2.4.1
 django-oauth-toolkit<1.2            # Provides oAuth2 capabilities for Django. 1.2+ requires Django 2 and Python 3.5
-django-pipeline==1.5.3
+django-pipeline
 django-pyfs
 django-ratelimit
 django-ratelimit-backend==1.1.1
@@ -79,7 +79,7 @@ edx-enterprise
 edx-milestones
 edx-oauth2-provider
 edx-organizations
-edx-proctoring>=1.6.0
+edx-proctoring>=2.0.1
 edx-proctoring-proctortrack==1.0.5  # Intentionally and permanently pinned to ensure code changes are reviewed
 edx-rest-api-client
 edx-search
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 42195d9846c3a026f268a79762baf5e96be9b422..a67b8cf0f224f4c8c208cc39680be16eebbfe919 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -82,7 +82,7 @@ django-multi-email-field==0.5.1  # via edx-enterprise
 django-mysql==2.4.1
 django-oauth-toolkit==1.1.3
 django-object-actions==0.10.0  # via edx-enterprise
-django-pipeline==1.5.3
+django-pipeline==1.6.14
 django-pyfs==2.0
 django-ratelimit-backend==1.1.1
 django-ratelimit==2.0.0
@@ -119,7 +119,7 @@ edx-oauth2-provider==1.2.2
 edx-opaque-keys[django]==0.4.4
 edx-organizations==2.0.2
 edx-proctoring-proctortrack==1.0.5
-edx-proctoring==2.0.0
+edx-proctoring==2.0.1
 edx-rbac==0.2.0           # via edx-enterprise
 edx-rest-api-client==1.9.2
 edx-search==1.2.2
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 5e63b516761acce780dbfdea44bc09e4c8f981df..4cdbec14c5e7afcc7cf6fb9e58353f247e5d8d53 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -72,6 +72,7 @@ code-annotations==0.3.1
 colorama==0.4.1
 configparser==3.7.4
 constantly==15.1.0
+contextlib2==0.5.5
 coreapi==2.3.3
 coreschema==0.0.4
 coverage==4.4
@@ -103,7 +104,7 @@ django-multi-email-field==0.5.1
 django-mysql==2.4.1
 django-oauth-toolkit==1.1.3
 django-object-actions==0.10.0
-django-pipeline==1.5.3
+django-pipeline==1.6.14
 django-pyfs==2.0
 django-ratelimit-backend==1.1.1
 django-ratelimit==2.0.0
@@ -141,7 +142,7 @@ edx-oauth2-provider==1.2.2
 edx-opaque-keys[django]==0.4.4
 edx-organizations==2.0.2
 edx-proctoring-proctortrack==1.0.5
-edx-proctoring==2.0.0
+edx-proctoring==2.0.1
 edx-rbac==0.2.0
 edx-rest-api-client==1.9.2
 edx-search==1.2.2
@@ -180,6 +181,7 @@ httpretty==0.9.6
 hyperlink==19.0.0
 idna==2.8
 imagesize==1.1.0          # via sphinx
+importlib-metadata==0.9
 incremental==17.5.0
 inflect==2.1.0
 ipaddress==1.0.22
@@ -233,7 +235,7 @@ pdfminer.six==20181108
 piexif==1.0.2
 pillow==6.0.0
 pip-tools==3.6.1
-pluggy==0.9.0
+pluggy==0.10.0
 polib==1.1.0
 psutil==1.2.1
 py2neo==3.1.2
@@ -346,4 +348,5 @@ xblock-utils==1.2.1
 xblock==1.2.2
 xmltodict==0.12.0
 zendesk==1.1.1
+zipp==0.4.0
 zope.interface==4.6.0
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 139df17752e6260648994e6875ea6b3a9934c550..be1cd4aba57d5dab4c26cb6e4e96aff838c1dc53 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -68,8 +68,9 @@ click-log==0.3.2          # via edx-lint
 click==7.0
 code-annotations==0.3.1
 colorama==0.4.1           # via radon
-configparser==3.7.4       # via entrypoints, flake8, pylint
+configparser==3.7.4       # via entrypoints, flake8, importlib-metadata, pylint
 constantly==15.1.0        # via twisted
+contextlib2==0.5.5        # via importlib-metadata
 coreapi==2.3.3
 coreschema==0.0.4
 coverage==4.4
@@ -100,7 +101,7 @@ django-multi-email-field==0.5.1
 django-mysql==2.4.1
 django-oauth-toolkit==1.1.3
 django-object-actions==0.10.0
-django-pipeline==1.5.3
+django-pipeline==1.6.14
 django-pyfs==2.0
 django-ratelimit-backend==1.1.1
 django-ratelimit==2.0.0
@@ -137,7 +138,7 @@ edx-oauth2-provider==1.2.2
 edx-opaque-keys[django]==0.4.4
 edx-organizations==2.0.2
 edx-proctoring-proctortrack==1.0.5
-edx-proctoring==2.0.0
+edx-proctoring==2.0.1
 edx-rbac==0.2.0
 edx-rest-api-client==1.9.2
 edx-search==1.2.2
@@ -174,6 +175,7 @@ httplib2==0.12.3
 httpretty==0.9.6
 hyperlink==19.0.0         # via twisted
 idna==2.8
+importlib-metadata==0.9   # via pluggy
 incremental==17.5.0       # via twisted
 inflect==2.1.0
 ipaddress==1.0.22
@@ -218,14 +220,14 @@ pa11ycrawler==1.7.3
 packaging==19.0           # via caniusepython3
 parsel==1.5.1             # via scrapy
 path.py==8.2.1
-pathlib2==2.3.3           # via pytest, pytest-django
+pathlib2==2.3.3           # via importlib-metadata, pytest, pytest-django
 pathtools==0.1.2
 paver==1.3.4
 pbr==5.2.0
 pdfminer.six==20181108
 piexif==1.0.2
 pillow==6.0.0
-pluggy==0.9.0             # via pytest, tox
+pluggy==0.10.0            # via pytest, tox
 polib==1.1.0
 psutil==1.2.1
 py2neo==3.1.2
@@ -332,4 +334,5 @@ xblock-utils==1.2.1
 xblock==1.2.2
 xmltodict==0.12.0         # via moto
 zendesk==1.1.1
+zipp==0.4.0               # via importlib-metadata
 zope.interface==4.6.0     # via twisted