diff --git a/glue/_plugin_helpers.py b/glue/_plugin_helpers.py
index 52820b6c7..26c92a099 100644
--- a/glue/_plugin_helpers.py
+++ b/glue/_plugin_helpers.py
@@ -16,6 +16,19 @@
     from importlib_metadata import entry_points
 
 
+REQUIRED_PLUGINS = ['glue.plugins.coordinate_helpers',
+                    'glue.core.data_exporters',
+                    'glue.io.formats.fits']
+
+
+REQUIRED_PLUGINS_QT = ['glue_qt.plugins.tools.pv_slicer',
+                       'glue_qt.viewers.image',
+                       'glue_qt.viewers.scatter',
+                       'glue_qt.viewers.histogram',
+                       'glue_qt.viewers.profile',
+                       'glue_qt.viewers.table']
+
+
 def iter_plugin_entry_points():
     return iter(entry_points(group='glue.plugins'))
 
diff --git a/glue/main.py b/glue/main.py
index dc566e1cf..37b1013c3 100755
--- a/glue/main.py
+++ b/glue/main.py
@@ -3,25 +3,29 @@
 from importlib import import_module
 
 from glue.logger import logger
+from glue._plugin_helpers import REQUIRED_PLUGINS, REQUIRED_PLUGINS_QT
 
 
 _loaded_plugins = set()
 _installed_plugins = set()
 
-REQUIRED_PLUGINS = ['glue.plugins.coordinate_helpers',
-                    'glue.core.data_exporters',
-                    'glue.io.formats.fits']
 
+def load_plugins(splash=None, require_qt_plugins=False, plugins_to_load=None):
+    """
 
-REQUIRED_PLUGINS_QT = ['glue.plugins.tools.pv_slicer.qt',
-                       'glue.viewers.image.qt',
-                       'glue.viewers.scatter.qt',
-                       'glue.viewers.histogram.qt',
-                       'glue.viewers.profile.qt',
-                       'glue.viewers.table.qt']
+    Parameters
+    ----------
+    splash : default: None
+        instance of splash http rendering service
+    require_qt_plugins : boolean default: False
+        whether to use qt plugins defined in constant REQUIRED_PLUGINS_QT
+    plugins_to_load : list
+        desired valid plugin strings
 
+    Returns
+    -------
 
-def load_plugins(splash=None, require_qt_plugins=False):
+    """
 
     # Search for plugins installed via entry_points. Basically, any package can
     # define plugins for glue, and needs to define an entry point using the
@@ -44,18 +48,28 @@ def load_plugins(splash=None, require_qt_plugins=False):
     from glue._plugin_helpers import iter_plugin_entry_points, PluginConfig
     config = PluginConfig.load()
 
-    n_plugins = len(list(iter_plugin_entry_points()))
+    if plugins_to_load is None:
+        plugins_to_load = [i.value for i in list(iter_plugin_entry_points())]
+        if require_qt_plugins:
+            plugins_to_require = [*REQUIRED_PLUGINS, *REQUIRED_PLUGINS_QT]
+        else:
+            plugins_to_require = REQUIRED_PLUGINS
+    else:
+        plugins_to_require = plugins_to_load
+    n_plugins = len(plugins_to_require)
 
-    for iplugin, item in enumerate(iter_plugin_entry_points()):
-        if item.module not in _installed_plugins:
-            _installed_plugins.add(item.name)
+    for i_plugin, item in enumerate(list(iter_plugin_entry_points())):
+        if item.value.replace(':setup', '') in plugins_to_load:
+            if item.module not in _installed_plugins:
+                _installed_plugins.add(item.name)
 
-        if item.module in _loaded_plugins:
-            logger.info("Plugin {0} already loaded".format(item.name))
-            continue
+            if item.module in _loaded_plugins:
+                logger.info("Plugin {0} already loaded".format(item.name))
+                continue
 
-        if not config.plugins[item.name]:
-            continue
+            # loads all plugins, want to make this more customisable
+            if not config.plugins[item.name]:
+                continue
 
         # We don't use item.load() because that then checks requirements of all
         # the imported packages, which can lead to errors like this one that
@@ -68,7 +82,7 @@ def load_plugins(splash=None, require_qt_plugins=False):
         # old version of a package in the environment, but this can confuse
         # users as importing astropy directly would work (as setuptools then
         # doesn't do a stringent test of dependency versions). Often this kind
-        # of error can occur if there is a conda version of a package and and
+        # of error can occur if there is a conda version of a package and an
         # older pip version.
 
         try:
@@ -78,9 +92,7 @@ def load_plugins(splash=None, require_qt_plugins=False):
         except Exception as exc:
             # Here we check that some of the 'core' plugins load well and
             # raise an actual exception if not.
-            if item.module in REQUIRED_PLUGINS:
-                raise
-            elif item.module in REQUIRED_PLUGINS_QT and require_qt_plugins:
+            if item.module in plugins_to_require:
                 raise
             else:
                 logger.info("Loading plugin {0} failed "
@@ -90,7 +102,7 @@ def load_plugins(splash=None, require_qt_plugins=False):
             _loaded_plugins.add(item.module)
 
         if splash is not None:
-            splash.set_progress(100. * iplugin / float(n_plugins))
+            splash.set_progress(100. * i_plugin / float(n_plugins))
 
     try:
         config.save()