diff --git a/cms/envs/common.py b/cms/envs/common.py
index b914239585c86125f122c14ac623f0887bb3facc..e90d2b21393b3654975b94e5d34baa48d7554200 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -24,6 +24,7 @@ Longer TODO:
 # want to import all variables from base settings files
 # pylint: disable=W0401, W0611, W0614
 
+import imp
 import sys
 import lms.envs.common
 from lms.envs.common import (
@@ -467,9 +468,6 @@ INSTALLED_APPS = (
     # for course creator table
     'django.contrib.admin',
 
-    # XBlocks containing migrations
-    'mentoring',
-
     # for managing course modes
     'course_modes',
 
@@ -536,11 +534,22 @@ MAX_FAILED_LOGIN_ATTEMPTS_ALLOWED = 5
 MAX_FAILED_LOGIN_ATTEMPTS_LOCKOUT_PERIOD_SECS = 15 * 60
 
 
-### JSdraw (only installed in some instances)
+### Apps only installed in some instances
+
+OPTIONAL_APPS = (
+    'edx_jsdraw',
+    'mentoring',
+)
 
-try:
-    import edx_jsdraw
-except ImportError:
-    pass
-else:
-    INSTALLED_APPS += ('edx_jsdraw',)
+for app_name in OPTIONAL_APPS:
+    # First attempt to only find the module rather than actually importing it,
+    # to avoid circular references - only try to import if it can't be found
+    # by find_module, which doesn't work with import hooks
+    try:
+        imp.find_module(app_name)
+    except ImportError:
+        try:
+            __import__(app_name)
+        except ImportError:
+            continue
+    INSTALLED_APPS += (app_name,)
diff --git a/lms/envs/common.py b/lms/envs/common.py
index e31a7bb115d0687dbbed9338757e3783cac69e69..a11480a0f513189d51adaf20bcec99e273a40425 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -26,6 +26,7 @@ Longer TODO:
 
 import sys
 import os
+import imp
 import json
 
 from path import path
@@ -1163,9 +1164,6 @@ INSTALLED_APPS = (
     'reverification',
 
     'embargo',
-
-    # XBlocks containing migrations
-    'mentoring',
 )
 
 ######################### MARKETING SITE ###############################
@@ -1458,11 +1456,22 @@ ALL_LANGUAGES = (
 )
 
 
-### JSdraw (only installed in some instances)
+### Apps only installed in some instances
+
+OPTIONAL_APPS = (
+    'edx_jsdraw',
+    'mentoring',
+)
 
-try:
-    import edx_jsdraw
-except ImportError:
-    pass
-else:
-    INSTALLED_APPS += ('edx_jsdraw',)
+for app_name in OPTIONAL_APPS:
+    # First attempt to only find the module rather than actually importing it,
+    # to avoid circular references - only try to import if it can't be found
+    # by find_module, which doesn't work with import hooks
+    try:
+        imp.find_module(app_name)
+    except ImportError:
+        try:
+            __import__(app_name)
+        except ImportError:
+            continue
+    INSTALLED_APPS += (app_name,)