diff --git a/common/lib/xmodule/x_module.py b/common/lib/xmodule/x_module.py
index 191cda6b06d85530785872ac6d61287cc0eb6651..f628abe5f1e54730c8c897096154b7966ae31372 100644
--- a/common/lib/xmodule/x_module.py
+++ b/common/lib/xmodule/x_module.py
@@ -23,6 +23,9 @@ class Plugin(object):
 
         entry_point: The name of the entry point to load plugins from
     """
+
+    _plugin_cache = None
+
     @classmethod
     def load_class(cls, identifier, default=None):
         """
@@ -33,20 +36,25 @@ class Plugin(object):
         If default is not None, will return default if no entry_point matching identifier
         is found. Otherwise, will raise a ModuleMissingError
         """
-        identifier = identifier.lower()
-        classes = list(pkg_resources.iter_entry_points(cls.entry_point, name=identifier))
-        if len(classes) > 1:
-            log.warning("Found multiple classes for {entry_point} with identifier {id}: {classes}. Returning the first one.".format(
-                entry_point=cls.entry_point,
-                id=identifier,
-                classes=", ".join(class_.module_name for class_ in classes)))
-
-        if len(classes) == 0:
-            if default is not None:
-                return default
-            raise ModuleMissingError(identifier)
-
-        return classes[0].load()
+        if cls._plugin_cache is None:
+            cls._plugin_cache = {}
+
+        if identifier not in cls._plugin_cache:
+            identifier = identifier.lower()
+            classes = list(pkg_resources.iter_entry_points(cls.entry_point, name=identifier))
+            if len(classes) > 1:
+                log.warning("Found multiple classes for {entry_point} with identifier {id}: {classes}. Returning the first one.".format(
+                    entry_point=cls.entry_point,
+                    id=identifier,
+                    classes=", ".join(class_.module_name for class_ in classes)))
+
+            if len(classes) == 0:
+                if default is not None:
+                    return default
+                raise ModuleMissingError(identifier)
+
+            cls._plugin_cache[identifier] = classes[0].load()
+        return cls._plugin_cache[identifier]
 
     @classmethod
     def load_classes(cls):