diff --git a/glue_jupyter/bqplot/histogram/__init__.py b/glue_jupyter/bqplot/histogram/__init__.py
index f2efc8a1..46c5195e 100644
--- a/glue_jupyter/bqplot/histogram/__init__.py
+++ b/glue_jupyter/bqplot/histogram/__init__.py
@@ -1,2 +1,6 @@
 from .layer_artist import *  # noqa
 from .viewer import *  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/bqplot/image/__init__.py b/glue_jupyter/bqplot/image/__init__.py
index f2efc8a1..46c5195e 100644
--- a/glue_jupyter/bqplot/image/__init__.py
+++ b/glue_jupyter/bqplot/image/__init__.py
@@ -1,2 +1,6 @@
 from .layer_artist import *  # noqa
 from .viewer import *  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/bqplot/profile/__init__.py b/glue_jupyter/bqplot/profile/__init__.py
index f2efc8a1..46c5195e 100644
--- a/glue_jupyter/bqplot/profile/__init__.py
+++ b/glue_jupyter/bqplot/profile/__init__.py
@@ -1,2 +1,6 @@
 from .layer_artist import *  # noqa
 from .viewer import *  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/bqplot/scatter/__init__.py b/glue_jupyter/bqplot/scatter/__init__.py
index f2efc8a1..46c5195e 100644
--- a/glue_jupyter/bqplot/scatter/__init__.py
+++ b/glue_jupyter/bqplot/scatter/__init__.py
@@ -1,2 +1,6 @@
 from .layer_artist import *  # noqa
 from .viewer import *  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/ipyvolume/__init__.py b/glue_jupyter/ipyvolume/__init__.py
index db578fb0..ea4ef9a7 100644
--- a/glue_jupyter/ipyvolume/__init__.py
+++ b/glue_jupyter/ipyvolume/__init__.py
@@ -1,2 +1,6 @@
 from .volume.viewer import IpyvolumeVolumeView  # noqa
 from .scatter.viewer import IpyvolumeScatterView  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/ipyvolume/scatter/__init__.py b/glue_jupyter/ipyvolume/scatter/__init__.py
index 39dd5964..c9df7125 100644
--- a/glue_jupyter/ipyvolume/scatter/__init__.py
+++ b/glue_jupyter/ipyvolume/scatter/__init__.py
@@ -1,3 +1,7 @@
 from .layer_artist import *  # noqa
 from .layer_style_widget import *  # noqa
 from .viewer import *  # noqa
+
+
+def setup():
+    pass
diff --git a/glue_jupyter/ipyvolume/scatter/viewer.py b/glue_jupyter/ipyvolume/scatter/viewer.py
index e82f3e72..81a61563 100644
--- a/glue_jupyter/ipyvolume/scatter/viewer.py
+++ b/glue_jupyter/ipyvolume/scatter/viewer.py
@@ -1,4 +1,6 @@
 from glue_jupyter.common.state3d import Scatter3DViewerState
+from glue_jupyter.registries import viewer_registry
+
 from .layer_artist import IpyvolumeScatterLayerArtist
 from .layer_style_widget import Scatter3DLayerStateWidget
 from ..common.viewer_options_widget import Viewer3DStateWidget
@@ -7,6 +9,7 @@
 __all__ = ['IpyvolumeScatterView']
 
 
+@viewer_registry("scatter3d")
 class IpyvolumeScatterView(IpyvolumeBaseView):
 
     allow_duplicate_data = False
diff --git a/glue_jupyter/table/__init__.py b/glue_jupyter/table/__init__.py
index 53136ac4..a700dc6a 100644
--- a/glue_jupyter/table/__init__.py
+++ b/glue_jupyter/table/__init__.py
@@ -1 +1,5 @@
 from .viewer import TableViewer  # noqa
+
+
+def setup():
+    pass
diff --git a/setup.cfg b/setup.cfg
index 321657b1..0e3a7a72 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -28,6 +28,16 @@ install_requires =
     bqplot-gl
     scikit-image
 
+[options.entry_points]
+glue.plugins =
+    histogram = glue_jupyter.bqplot.histogram:setup
+    image = glue_jupyter.bqplot.image:setup
+    profile = glue_jupyter.bqplot.profile:setup
+    scatter = glue_jupyter.bqplot.scatter:setup
+    table = glue_jupyter.table:setup
+    scatter3d = glue_jupyter.ipyvolume.scatter:setup
+    volume = glue_jupyter.ipyvolume.volume:setup
+
 [options.extras_require]
 test =
     pytest