diff --git a/.gitignore b/.gitignore
index 5765b552858ec4aeb417a475ded1931f41f050e7..0d20b6487c61e7d1bde93acf4a14b7a89083a16d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
 *.pyc
-*.rst
diff --git a/doc/fsl.data.atlases.rst b/doc/fsl.data.atlases.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b7eb2aaea8dca51378e76789a769049f207e6c0c
--- /dev/null
+++ b/doc/fsl.data.atlases.rst
@@ -0,0 +1,7 @@
+fsl.data.atlases module
+=======================
+
+.. automodule:: fsl.data.atlases
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.constants.rst b/doc/fsl.data.constants.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8592b3b62c640873d6ce8f8854551511a620d747
--- /dev/null
+++ b/doc/fsl.data.constants.rst
@@ -0,0 +1,7 @@
+fsl.data.constants module
+=========================
+
+.. automodule:: fsl.data.constants
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.featimage.rst b/doc/fsl.data.featimage.rst
new file mode 100644
index 0000000000000000000000000000000000000000..467b6136fc44a9afa11376aa31d222572acb2aa5
--- /dev/null
+++ b/doc/fsl.data.featimage.rst
@@ -0,0 +1,7 @@
+fsl.data.featimage module
+=========================
+
+.. automodule:: fsl.data.featimage
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.featresults.rst b/doc/fsl.data.featresults.rst
new file mode 100644
index 0000000000000000000000000000000000000000..75458c3b9fab734f802df03515f05e33c12bd656
--- /dev/null
+++ b/doc/fsl.data.featresults.rst
@@ -0,0 +1,7 @@
+fsl.data.featresults module
+===========================
+
+.. automodule:: fsl.data.featresults
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.image.rst b/doc/fsl.data.image.rst
new file mode 100644
index 0000000000000000000000000000000000000000..5afa856490eca46efb899c0f77c0943349f67ea2
--- /dev/null
+++ b/doc/fsl.data.image.rst
@@ -0,0 +1,7 @@
+fsl.data.image module
+=====================
+
+.. automodule:: fsl.data.image
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.model.rst b/doc/fsl.data.model.rst
new file mode 100644
index 0000000000000000000000000000000000000000..81d5619f36c9b4cf4ed5ea971db623925da1b553
--- /dev/null
+++ b/doc/fsl.data.model.rst
@@ -0,0 +1,7 @@
+fsl.data.model module
+=====================
+
+.. automodule:: fsl.data.model
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.rst b/doc/fsl.data.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f768559d50e1266026b89b027bd01ef185ef3be6
--- /dev/null
+++ b/doc/fsl.data.rst
@@ -0,0 +1,23 @@
+fsl.data package
+================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.data.atlases
+   fsl.data.constants
+   fsl.data.featimage
+   fsl.data.featresults
+   fsl.data.image
+   fsl.data.model
+   fsl.data.strings
+
+Module contents
+---------------
+
+.. automodule:: fsl.data
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.data.strings.rst b/doc/fsl.data.strings.rst
new file mode 100644
index 0000000000000000000000000000000000000000..63fd9a8dc69085c5386412a553bd55bad15c2f63
--- /dev/null
+++ b/doc/fsl.data.strings.rst
@@ -0,0 +1,7 @@
+fsl.data.strings module
+=======================
+
+.. automodule:: fsl.data.strings
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.copyoverlay.rst b/doc/fsl.fsleyes.actions.copyoverlay.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b4c97d1b638472c2860ada31b4fe194799928c68
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.copyoverlay.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.actions.copyoverlay module
+======================================
+
+.. automodule:: fsl.fsleyes.actions.copyoverlay
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.loadcolourmap.rst b/doc/fsl.fsleyes.actions.loadcolourmap.rst
new file mode 100644
index 0000000000000000000000000000000000000000..514039979a437d7d7af24c637460597209b70fdb
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.loadcolourmap.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.actions.loadcolourmap module
+========================================
+
+.. automodule:: fsl.fsleyes.actions.loadcolourmap
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.openfile.rst b/doc/fsl.fsleyes.actions.openfile.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2c77c9cac12c0a79c927df834fce055ea10fcb27
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.openfile.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.actions.openfile module
+===================================
+
+.. automodule:: fsl.fsleyes.actions.openfile
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.openstandard.rst b/doc/fsl.fsleyes.actions.openstandard.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2bf4352a094b230370e93bdd96c98dab51ea5d8d
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.openstandard.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.actions.openstandard module
+=======================================
+
+.. automodule:: fsl.fsleyes.actions.openstandard
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.rst b/doc/fsl.fsleyes.actions.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f6b49d200de8ad581e0339b1b475708706b521fa
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.rst
@@ -0,0 +1,21 @@
+fsl.fsleyes.actions package
+===========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.actions.copyoverlay
+   fsl.fsleyes.actions.loadcolourmap
+   fsl.fsleyes.actions.openfile
+   fsl.fsleyes.actions.openstandard
+   fsl.fsleyes.actions.saveoverlay
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.actions
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.actions.saveoverlay.rst b/doc/fsl.fsleyes.actions.saveoverlay.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c8e47258a739ea9607d25fb5e071699dd6971fd2
--- /dev/null
+++ b/doc/fsl.fsleyes.actions.saveoverlay.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.actions.saveoverlay module
+======================================
+
+.. automodule:: fsl.fsleyes.actions.saveoverlay
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.colourmaps.rst b/doc/fsl.fsleyes.colourmaps.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cb059ca035f1cb8e13f058a7ec86f87cef0d68d7
--- /dev/null
+++ b/doc/fsl.fsleyes.colourmaps.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.colourmaps module
+=============================
+
+.. automodule:: fsl.fsleyes.colourmaps
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.atlasinfopanel.rst b/doc/fsl.fsleyes.controls.atlasinfopanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..428df0f6dcb39fc02fe047672c01141cdac875da
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.atlasinfopanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.atlasinfopanel module
+==========================================
+
+.. automodule:: fsl.fsleyes.controls.atlasinfopanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.atlasoverlaypanel.rst b/doc/fsl.fsleyes.controls.atlasoverlaypanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..5be5a076e6e535f6f653e5ddd389993dcfdb811e
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.atlasoverlaypanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.atlasoverlaypanel module
+=============================================
+
+.. automodule:: fsl.fsleyes.controls.atlasoverlaypanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.atlaspanel.rst b/doc/fsl.fsleyes.controls.atlaspanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fa5dbafc144abe0d8423117f6d44df36d923acb8
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.atlaspanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.atlaspanel module
+======================================
+
+.. automodule:: fsl.fsleyes.controls.atlaspanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.canvassettingspanel.rst b/doc/fsl.fsleyes.controls.canvassettingspanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f06026405b0a8afd8d71d59a653189c0e3ed5a2f
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.canvassettingspanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.canvassettingspanel module
+===============================================
+
+.. automodule:: fsl.fsleyes.controls.canvassettingspanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.clusterpanel.rst b/doc/fsl.fsleyes.controls.clusterpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..85da18f4671f188423e4c99b9a17cc1dc0434e0e
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.clusterpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.clusterpanel module
+========================================
+
+.. automodule:: fsl.fsleyes.controls.clusterpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.histogramcontrolpanel.rst b/doc/fsl.fsleyes.controls.histogramcontrolpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..91a01aaa0176c35636758cb0dbcb768adab96bea
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.histogramcontrolpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.histogramcontrolpanel module
+=================================================
+
+.. automodule:: fsl.fsleyes.controls.histogramcontrolpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.histogramlistpanel.rst b/doc/fsl.fsleyes.controls.histogramlistpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f12eb50a5956073a5aa88d43bc7cf9587174db2c
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.histogramlistpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.histogramlistpanel module
+==============================================
+
+.. automodule:: fsl.fsleyes.controls.histogramlistpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.lightboxtoolbar.rst b/doc/fsl.fsleyes.controls.lightboxtoolbar.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3af4af9f3def483ea1acf351f668c5da212f6a44
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.lightboxtoolbar.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.lightboxtoolbar module
+===========================================
+
+.. automodule:: fsl.fsleyes.controls.lightboxtoolbar
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.locationpanel.rst b/doc/fsl.fsleyes.controls.locationpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6eab300d848a118b7ebd2d6e7ab7c204d366503d
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.locationpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.locationpanel module
+=========================================
+
+.. automodule:: fsl.fsleyes.controls.locationpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.lookuptablepanel.rst b/doc/fsl.fsleyes.controls.lookuptablepanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..155c9ebaa89f48416854e18aaf6b07ec4b2d7225
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.lookuptablepanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.lookuptablepanel module
+============================================
+
+.. automodule:: fsl.fsleyes.controls.lookuptablepanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.orthoedittoolbar.rst b/doc/fsl.fsleyes.controls.orthoedittoolbar.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a1c03231f91606a104b7f48bd6e8e0ce37875fca
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.orthoedittoolbar.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.orthoedittoolbar module
+============================================
+
+.. automodule:: fsl.fsleyes.controls.orthoedittoolbar
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.orthotoolbar.rst b/doc/fsl.fsleyes.controls.orthotoolbar.rst
new file mode 100644
index 0000000000000000000000000000000000000000..dbca238f3d9e4816b41023f799113917655b1280
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.orthotoolbar.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.orthotoolbar module
+========================================
+
+.. automodule:: fsl.fsleyes.controls.orthotoolbar
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.overlaydisplaypanel.rst b/doc/fsl.fsleyes.controls.overlaydisplaypanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a063d0508df1a643cedb3ab91f079786b8d7775c
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.overlaydisplaypanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.overlaydisplaypanel module
+===============================================
+
+.. automodule:: fsl.fsleyes.controls.overlaydisplaypanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.overlaydisplaytoolbar.rst b/doc/fsl.fsleyes.controls.overlaydisplaytoolbar.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c1a530ec4d409074dd2d12dd71861e39d4ede39e
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.overlaydisplaytoolbar.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.overlaydisplaytoolbar module
+=================================================
+
+.. automodule:: fsl.fsleyes.controls.overlaydisplaytoolbar
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.overlayinfopanel.rst b/doc/fsl.fsleyes.controls.overlayinfopanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..565ddca51708f1116463198a72f6e48715f7b06e
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.overlayinfopanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.overlayinfopanel module
+============================================
+
+.. automodule:: fsl.fsleyes.controls.overlayinfopanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.overlaylistpanel.rst b/doc/fsl.fsleyes.controls.overlaylistpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..54a9ec9980362c2d6f91aac1be8fac0bb2065964
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.overlaylistpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.overlaylistpanel module
+============================================
+
+.. automodule:: fsl.fsleyes.controls.overlaylistpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.rst b/doc/fsl.fsleyes.controls.rst
new file mode 100644
index 0000000000000000000000000000000000000000..94d35c059c0603b54f844f38093f59a2a978d681
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.rst
@@ -0,0 +1,35 @@
+fsl.fsleyes.controls package
+============================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.controls.atlasinfopanel
+   fsl.fsleyes.controls.atlasoverlaypanel
+   fsl.fsleyes.controls.atlaspanel
+   fsl.fsleyes.controls.canvassettingspanel
+   fsl.fsleyes.controls.clusterpanel
+   fsl.fsleyes.controls.histogramcontrolpanel
+   fsl.fsleyes.controls.histogramlistpanel
+   fsl.fsleyes.controls.lightboxtoolbar
+   fsl.fsleyes.controls.locationpanel
+   fsl.fsleyes.controls.lookuptablepanel
+   fsl.fsleyes.controls.orthoedittoolbar
+   fsl.fsleyes.controls.orthotoolbar
+   fsl.fsleyes.controls.overlaydisplaypanel
+   fsl.fsleyes.controls.overlaydisplaytoolbar
+   fsl.fsleyes.controls.overlayinfopanel
+   fsl.fsleyes.controls.overlaylistpanel
+   fsl.fsleyes.controls.shellpanel
+   fsl.fsleyes.controls.timeseriescontrolpanel
+   fsl.fsleyes.controls.timeserieslistpanel
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.controls
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.shellpanel.rst b/doc/fsl.fsleyes.controls.shellpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4f939d5617af27441984caff529667b8be288515
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.shellpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.shellpanel module
+======================================
+
+.. automodule:: fsl.fsleyes.controls.shellpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.timeseriescontrolpanel.rst b/doc/fsl.fsleyes.controls.timeseriescontrolpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8a9f812ad47499ab184a079f9a7bffbe4f36d93a
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.timeseriescontrolpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.timeseriescontrolpanel module
+==================================================
+
+.. automodule:: fsl.fsleyes.controls.timeseriescontrolpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.controls.timeserieslistpanel.rst b/doc/fsl.fsleyes.controls.timeserieslistpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..66a53a50d3914100609f6b33ec41664163f1d518
--- /dev/null
+++ b/doc/fsl.fsleyes.controls.timeserieslistpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.controls.timeserieslistpanel module
+===============================================
+
+.. automodule:: fsl.fsleyes.controls.timeserieslistpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.canvasopts.rst b/doc/fsl.fsleyes.displaycontext.canvasopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..aa22fb8f194f794ec43832aba96c404b293a617f
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.canvasopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.canvasopts module
+============================================
+
+.. automodule:: fsl.fsleyes.displaycontext.canvasopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.display.rst b/doc/fsl.fsleyes.displaycontext.display.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7a1d12a1a04a166417058ae4918975334ee48508
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.display.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.display module
+=========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.display
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.displaycontext.rst b/doc/fsl.fsleyes.displaycontext.displaycontext.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1a999d6ef1151ad5100bda873f14d86c5a8d9177
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.displaycontext.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.displaycontext module
+================================================
+
+.. automodule:: fsl.fsleyes.displaycontext.displaycontext
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.group.rst b/doc/fsl.fsleyes.displaycontext.group.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c72f0942964e579948683cdbe4b31472ae3e3c5c
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.group.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.group module
+=======================================
+
+.. automodule:: fsl.fsleyes.displaycontext.group
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.labelopts.rst b/doc/fsl.fsleyes.displaycontext.labelopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..21ababe28d0a96c216bda417ce2a4a271e28acd6
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.labelopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.labelopts module
+===========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.labelopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.lightboxopts.rst b/doc/fsl.fsleyes.displaycontext.lightboxopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6260b81b5ef2fd4e7f1ec69323d5ca6f16755a8f
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.lightboxopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.lightboxopts module
+==============================================
+
+.. automodule:: fsl.fsleyes.displaycontext.lightboxopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.maskopts.rst b/doc/fsl.fsleyes.displaycontext.maskopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9f1cd7a66674dc982e2b2bb095fdd64ebdbecbc3
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.maskopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.maskopts module
+==========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.maskopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.modelopts.rst b/doc/fsl.fsleyes.displaycontext.modelopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..beba7e3dd28a6d77cc3a19d7b9df090f5f246b91
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.modelopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.modelopts module
+===========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.modelopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.orthoopts.rst b/doc/fsl.fsleyes.displaycontext.orthoopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1952a31531b91975447590bef13a08219b3adff0
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.orthoopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.orthoopts module
+===========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.orthoopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.rst b/doc/fsl.fsleyes.displaycontext.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3ee2e37cea88ac669e0195ac1666878e1f2daea2
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.rst
@@ -0,0 +1,28 @@
+fsl.fsleyes.displaycontext package
+==================================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.displaycontext.canvasopts
+   fsl.fsleyes.displaycontext.display
+   fsl.fsleyes.displaycontext.displaycontext
+   fsl.fsleyes.displaycontext.group
+   fsl.fsleyes.displaycontext.labelopts
+   fsl.fsleyes.displaycontext.lightboxopts
+   fsl.fsleyes.displaycontext.maskopts
+   fsl.fsleyes.displaycontext.modelopts
+   fsl.fsleyes.displaycontext.orthoopts
+   fsl.fsleyes.displaycontext.sceneopts
+   fsl.fsleyes.displaycontext.vectoropts
+   fsl.fsleyes.displaycontext.volumeopts
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.displaycontext
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.sceneopts.rst b/doc/fsl.fsleyes.displaycontext.sceneopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d50747d7f3836a003c2586597af05bb19d2209e0
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.sceneopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.sceneopts module
+===========================================
+
+.. automodule:: fsl.fsleyes.displaycontext.sceneopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.vectoropts.rst b/doc/fsl.fsleyes.displaycontext.vectoropts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1fa44e8c2f6ba49bc808502880bced1d3bb2e7a6
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.vectoropts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.vectoropts module
+============================================
+
+.. automodule:: fsl.fsleyes.displaycontext.vectoropts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.displaycontext.volumeopts.rst b/doc/fsl.fsleyes.displaycontext.volumeopts.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ca1ed479187525f2c03e9766c4b8abc38885a49f
--- /dev/null
+++ b/doc/fsl.fsleyes.displaycontext.volumeopts.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.displaycontext.volumeopts module
+============================================
+
+.. automodule:: fsl.fsleyes.displaycontext.volumeopts
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.editor.editor.rst b/doc/fsl.fsleyes.editor.editor.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f361d47fb76ff69a8170e414fa36c424c718788c
--- /dev/null
+++ b/doc/fsl.fsleyes.editor.editor.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.editor.editor module
+================================
+
+.. automodule:: fsl.fsleyes.editor.editor
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.editor.rst b/doc/fsl.fsleyes.editor.rst
new file mode 100644
index 0000000000000000000000000000000000000000..62d946c8269071f6d1b530b2751156c19d9df691
--- /dev/null
+++ b/doc/fsl.fsleyes.editor.rst
@@ -0,0 +1,18 @@
+fsl.fsleyes.editor package
+==========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.editor.editor
+   fsl.fsleyes.editor.selection
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.editor
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.editor.selection.rst b/doc/fsl.fsleyes.editor.selection.rst
new file mode 100644
index 0000000000000000000000000000000000000000..65528dcead22ed82773cb5ed9317a0006749ce23
--- /dev/null
+++ b/doc/fsl.fsleyes.editor.selection.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.editor.selection module
+===================================
+
+.. automodule:: fsl.fsleyes.editor.selection
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.frame.rst b/doc/fsl.fsleyes.frame.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3e718f2f5092aa80b06c824d020a12f9d1be293e
--- /dev/null
+++ b/doc/fsl.fsleyes.frame.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.frame module
+========================
+
+.. automodule:: fsl.fsleyes.frame
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.fsleyes_parseargs.rst b/doc/fsl.fsleyes.fsleyes_parseargs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..19ebf2c5f5a10ede1dcbc53615da42c0e296a109
--- /dev/null
+++ b/doc/fsl.fsleyes.fsleyes_parseargs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.fsleyes_parseargs module
+====================================
+
+.. automodule:: fsl.fsleyes.fsleyes_parseargs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.annotations.rst b/doc/fsl.fsleyes.gl.annotations.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6f2c632a17a378cb6390f99f88238af011bd29f3
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.annotations.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.annotations module
+=================================
+
+.. automodule:: fsl.fsleyes.gl.annotations
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.colourbarcanvas.rst b/doc/fsl.fsleyes.gl.colourbarcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..26c3e1397b7b824c4fdc7642e7f79758d9b995a4
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.colourbarcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.colourbarcanvas module
+=====================================
+
+.. automodule:: fsl.fsleyes.gl.colourbarcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.gllabel_funcs.rst b/doc/fsl.fsleyes.gl.gl14.gllabel_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1d7bb387f7ad942c76d304569989f8755907dc8a
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.gllabel_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl14.gllabel_funcs module
+========================================
+
+.. automodule:: fsl.fsleyes.gl.gl14.gllabel_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.gllinevector_funcs.rst b/doc/fsl.fsleyes.gl.gl14.gllinevector_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..0e627a8a2e045f4e62ee1425bfa829f533191638
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.gllinevector_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl14.gllinevector_funcs module
+=============================================
+
+.. automodule:: fsl.fsleyes.gl.gl14.gllinevector_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.glmodel_funcs.rst b/doc/fsl.fsleyes.gl.gl14.glmodel_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..14bb1f05ceeefab72c7f9da693a9397ff83ba00b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.glmodel_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl14.glmodel_funcs module
+========================================
+
+.. automodule:: fsl.fsleyes.gl.gl14.glmodel_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.glrgbvector_funcs.rst b/doc/fsl.fsleyes.gl.gl14.glrgbvector_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e2078a070a09acabe0d61f7335dbaf1e05dce875
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.glrgbvector_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl14.glrgbvector_funcs module
+============================================
+
+.. automodule:: fsl.fsleyes.gl.gl14.glrgbvector_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.glvolume_funcs.rst b/doc/fsl.fsleyes.gl.gl14.glvolume_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c3bb6d1f1e28bc4d448d9f6a43e8ff1b1a4eb27b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.glvolume_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl14.glvolume_funcs module
+=========================================
+
+.. automodule:: fsl.fsleyes.gl.gl14.glvolume_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl14.rst b/doc/fsl.fsleyes.gl.gl14.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ea95a125dfc0278569ff8793738a8f81abdbc75b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl14.rst
@@ -0,0 +1,21 @@
+fsl.fsleyes.gl.gl14 package
+===========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.gl.gl14.gllabel_funcs
+   fsl.fsleyes.gl.gl14.gllinevector_funcs
+   fsl.fsleyes.gl.gl14.glmodel_funcs
+   fsl.fsleyes.gl.gl14.glrgbvector_funcs
+   fsl.fsleyes.gl.gl14.glvolume_funcs
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.gl.gl14
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.gllabel_funcs.rst b/doc/fsl.fsleyes.gl.gl21.gllabel_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c6af36c6042862562bdcad974b5a64e4e2e77136
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.gllabel_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl21.gllabel_funcs module
+========================================
+
+.. automodule:: fsl.fsleyes.gl.gl21.gllabel_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.gllinevector_funcs.rst b/doc/fsl.fsleyes.gl.gl21.gllinevector_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..037563c4217b8eda0c754d783cddfcc7f9d2deb0
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.gllinevector_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl21.gllinevector_funcs module
+=============================================
+
+.. automodule:: fsl.fsleyes.gl.gl21.gllinevector_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.glmodel_funcs.rst b/doc/fsl.fsleyes.gl.gl21.glmodel_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..0a35ebd0998f2bab7e0780a1512fdf7185da235e
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.glmodel_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl21.glmodel_funcs module
+========================================
+
+.. automodule:: fsl.fsleyes.gl.gl21.glmodel_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.glrgbvector_funcs.rst b/doc/fsl.fsleyes.gl.gl21.glrgbvector_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e70b33b89dd4e4f119d8fce34b0939cbccecebf4
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.glrgbvector_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl21.glrgbvector_funcs module
+============================================
+
+.. automodule:: fsl.fsleyes.gl.gl21.glrgbvector_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.glvolume_funcs.rst b/doc/fsl.fsleyes.gl.gl21.glvolume_funcs.rst
new file mode 100644
index 0000000000000000000000000000000000000000..efec10c68bedc29ebbdc25a2a261cb492073258b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.glvolume_funcs.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gl21.glvolume_funcs module
+=========================================
+
+.. automodule:: fsl.fsleyes.gl.gl21.glvolume_funcs
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gl21.rst b/doc/fsl.fsleyes.gl.gl21.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a2e56fa3a12fad42cd46631fbe2c7746dda7afa5
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gl21.rst
@@ -0,0 +1,21 @@
+fsl.fsleyes.gl.gl21 package
+===========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.gl.gl21.gllabel_funcs
+   fsl.fsleyes.gl.gl21.gllinevector_funcs
+   fsl.fsleyes.gl.gl21.glmodel_funcs
+   fsl.fsleyes.gl.gl21.glrgbvector_funcs
+   fsl.fsleyes.gl.gl21.glvolume_funcs
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.gl.gl21
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gllabel.rst b/doc/fsl.fsleyes.gl.gllabel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3854502896f954ff1ac0106c32303c1b90b0f07a
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gllabel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gllabel module
+=============================
+
+.. automodule:: fsl.fsleyes.gl.gllabel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.gllinevector.rst b/doc/fsl.fsleyes.gl.gllinevector.rst
new file mode 100644
index 0000000000000000000000000000000000000000..183c441cbae1f925e09e1b094916d426327bdbf2
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.gllinevector.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.gllinevector module
+==================================
+
+.. automodule:: fsl.fsleyes.gl.gllinevector
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.glmask.rst b/doc/fsl.fsleyes.gl.glmask.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ad8f7b9528637858aefcea2648dce253b1ce11d5
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.glmask.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.glmask module
+============================
+
+.. automodule:: fsl.fsleyes.gl.glmask
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.glmodel.rst b/doc/fsl.fsleyes.gl.glmodel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f61b5cd21053cfe7be6e47a3defc02b0c176a2f2
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.glmodel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.glmodel module
+=============================
+
+.. automodule:: fsl.fsleyes.gl.glmodel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.globject.rst b/doc/fsl.fsleyes.gl.globject.rst
new file mode 100644
index 0000000000000000000000000000000000000000..60bfa24cc7d290858613486b4e05fb578383218b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.globject.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.globject module
+==============================
+
+.. automodule:: fsl.fsleyes.gl.globject
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.glrgbvector.rst b/doc/fsl.fsleyes.gl.glrgbvector.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8f70cdd0df859376cb5ef0c5a1a67d3f068edddb
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.glrgbvector.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.glrgbvector module
+=================================
+
+.. automodule:: fsl.fsleyes.gl.glrgbvector
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.glvector.rst b/doc/fsl.fsleyes.gl.glvector.rst
new file mode 100644
index 0000000000000000000000000000000000000000..0478a38bbabf7bc138e517cdd2cdd395147c1964
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.glvector.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.glvector module
+==============================
+
+.. automodule:: fsl.fsleyes.gl.glvector
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.glvolume.rst b/doc/fsl.fsleyes.gl.glvolume.rst
new file mode 100644
index 0000000000000000000000000000000000000000..55cb54e3dce4c33e99a06b95992733bef8c9a005
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.glvolume.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.glvolume module
+==============================
+
+.. automodule:: fsl.fsleyes.gl.glvolume
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.lightboxcanvas.rst b/doc/fsl.fsleyes.gl.lightboxcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d278d0ba93d0152a4f391747a0f8f40101c69848
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.lightboxcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.lightboxcanvas module
+====================================
+
+.. automodule:: fsl.fsleyes.gl.lightboxcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.osmesacolourbarcanvas.rst b/doc/fsl.fsleyes.gl.osmesacolourbarcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2b5dae17b19343abc2f0b5e4ac4a5fd7e6457fae
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.osmesacolourbarcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.osmesacolourbarcanvas module
+===========================================
+
+.. automodule:: fsl.fsleyes.gl.osmesacolourbarcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.osmesalightboxcanvas.rst b/doc/fsl.fsleyes.gl.osmesalightboxcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fd1e6ec694610c659d05fd11c8a2f23288e564a2
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.osmesalightboxcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.osmesalightboxcanvas module
+==========================================
+
+.. automodule:: fsl.fsleyes.gl.osmesalightboxcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.osmesaslicecanvas.rst b/doc/fsl.fsleyes.gl.osmesaslicecanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a47b8ec181261cc8d5cbd25606e668b1039ccc86
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.osmesaslicecanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.osmesaslicecanvas module
+=======================================
+
+.. automodule:: fsl.fsleyes.gl.osmesaslicecanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.resources.rst b/doc/fsl.fsleyes.gl.resources.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1568168eae40e015b6588f82262093c9955b4b54
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.resources.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.resources module
+===============================
+
+.. automodule:: fsl.fsleyes.gl.resources
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.routines.rst b/doc/fsl.fsleyes.gl.routines.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7b7ee75c81ebe438b932ffd47dfacd6c48103d56
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.routines.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.routines module
+==============================
+
+.. automodule:: fsl.fsleyes.gl.routines
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.rst b/doc/fsl.fsleyes.gl.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b44ab75628c4f970701cf06394f666914ddd24d2
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.rst
@@ -0,0 +1,46 @@
+fsl.fsleyes.gl package
+======================
+
+Subpackages
+-----------
+
+.. toctree::
+
+    fsl.fsleyes.gl.gl14
+    fsl.fsleyes.gl.gl21
+    fsl.fsleyes.gl.textures
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.gl.annotations
+   fsl.fsleyes.gl.colourbarcanvas
+   fsl.fsleyes.gl.gllabel
+   fsl.fsleyes.gl.gllinevector
+   fsl.fsleyes.gl.glmask
+   fsl.fsleyes.gl.glmodel
+   fsl.fsleyes.gl.globject
+   fsl.fsleyes.gl.glrgbvector
+   fsl.fsleyes.gl.glvector
+   fsl.fsleyes.gl.glvolume
+   fsl.fsleyes.gl.lightboxcanvas
+   fsl.fsleyes.gl.osmesacolourbarcanvas
+   fsl.fsleyes.gl.osmesalightboxcanvas
+   fsl.fsleyes.gl.osmesaslicecanvas
+   fsl.fsleyes.gl.resources
+   fsl.fsleyes.gl.routines
+   fsl.fsleyes.gl.shaders
+   fsl.fsleyes.gl.slicecanvas
+   fsl.fsleyes.gl.wxglcolourbarcanvas
+   fsl.fsleyes.gl.wxgllightboxcanvas
+   fsl.fsleyes.gl.wxglslicecanvas
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.gl
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.shaders.rst b/doc/fsl.fsleyes.gl.shaders.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f31ffca2469e952c66e591b776fac127a0126d8b
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.shaders.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.shaders module
+=============================
+
+.. automodule:: fsl.fsleyes.gl.shaders
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.slicecanvas.rst b/doc/fsl.fsleyes.gl.slicecanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fa53d95720fbf1d7bc22a9377658c1ba94fb94a3
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.slicecanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.slicecanvas module
+=================================
+
+.. automodule:: fsl.fsleyes.gl.slicecanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.colourmaptexture.rst b/doc/fsl.fsleyes.gl.textures.colourmaptexture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7dfae47fe33d609755cc779bd56fef34d7516f5f
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.colourmaptexture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.colourmaptexture module
+===============================================
+
+.. automodule:: fsl.fsleyes.gl.textures.colourmaptexture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.imagetexture.rst b/doc/fsl.fsleyes.gl.textures.imagetexture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d8ba6a1569a46dc35a06cfd88f37868666b6053d
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.imagetexture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.imagetexture module
+===========================================
+
+.. automodule:: fsl.fsleyes.gl.textures.imagetexture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.lookuptabletexture.rst b/doc/fsl.fsleyes.gl.textures.lookuptabletexture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..08e3f8e56d6ffa807ce256725026ec243bf6f4ca
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.lookuptabletexture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.lookuptabletexture module
+=================================================
+
+.. automodule:: fsl.fsleyes.gl.textures.lookuptabletexture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.rendertexture.rst b/doc/fsl.fsleyes.gl.textures.rendertexture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6b6dd2bb9fa52439e49255bf264b7f75c43235c9
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.rendertexture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.rendertexture module
+============================================
+
+.. automodule:: fsl.fsleyes.gl.textures.rendertexture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.rendertexturestack.rst b/doc/fsl.fsleyes.gl.textures.rendertexturestack.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8addd8bf42b769250f06ac7d93be9a8825c21c49
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.rendertexturestack.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.rendertexturestack module
+=================================================
+
+.. automodule:: fsl.fsleyes.gl.textures.rendertexturestack
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.rst b/doc/fsl.fsleyes.gl.textures.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b519ad0cdfe5626e5af0952227f445e69b6f2297
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.rst
@@ -0,0 +1,23 @@
+fsl.fsleyes.gl.textures package
+===============================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.gl.textures.colourmaptexture
+   fsl.fsleyes.gl.textures.imagetexture
+   fsl.fsleyes.gl.textures.lookuptabletexture
+   fsl.fsleyes.gl.textures.rendertexture
+   fsl.fsleyes.gl.textures.rendertexturestack
+   fsl.fsleyes.gl.textures.selectiontexture
+   fsl.fsleyes.gl.textures.texture
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.gl.textures
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.selectiontexture.rst b/doc/fsl.fsleyes.gl.textures.selectiontexture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2a5ea24978f72717e5d00eca6997e0e219bb8694
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.selectiontexture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.selectiontexture module
+===============================================
+
+.. automodule:: fsl.fsleyes.gl.textures.selectiontexture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.textures.texture.rst b/doc/fsl.fsleyes.gl.textures.texture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..eb6b072ae8d3c8da26bb27a3937f0dca5239b7c1
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.textures.texture.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.textures.texture module
+======================================
+
+.. automodule:: fsl.fsleyes.gl.textures.texture
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.wxglcolourbarcanvas.rst b/doc/fsl.fsleyes.gl.wxglcolourbarcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c83db18dd986b7b20c7462210e36fae6a3e4f0f7
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.wxglcolourbarcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.wxglcolourbarcanvas module
+=========================================
+
+.. automodule:: fsl.fsleyes.gl.wxglcolourbarcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.wxgllightboxcanvas.rst b/doc/fsl.fsleyes.gl.wxgllightboxcanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fc380c82c1962226c8aa4c76c4632a3b8ac07187
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.wxgllightboxcanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.wxgllightboxcanvas module
+========================================
+
+.. automodule:: fsl.fsleyes.gl.wxgllightboxcanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.gl.wxglslicecanvas.rst b/doc/fsl.fsleyes.gl.wxglslicecanvas.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3158ddc87ee12b3b4223ec9e06b1c0e8fbcd28f4
--- /dev/null
+++ b/doc/fsl.fsleyes.gl.wxglslicecanvas.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.gl.wxglslicecanvas module
+=====================================
+
+.. automodule:: fsl.fsleyes.gl.wxglslicecanvas
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.icons.rst b/doc/fsl.fsleyes.icons.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7ae77156a0336c068fcfa26bc07e187a7c0ce49e
--- /dev/null
+++ b/doc/fsl.fsleyes.icons.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.icons module
+========================
+
+.. automodule:: fsl.fsleyes.icons
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.overlay.rst b/doc/fsl.fsleyes.overlay.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3744215379974c3b3c656e42fa516bf8210d631a
--- /dev/null
+++ b/doc/fsl.fsleyes.overlay.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.overlay module
+==========================
+
+.. automodule:: fsl.fsleyes.overlay
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.panel.rst b/doc/fsl.fsleyes.panel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cd51b80b63ba9ebd676eeb0431c98088e5874c15
--- /dev/null
+++ b/doc/fsl.fsleyes.panel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.panel module
+========================
+
+.. automodule:: fsl.fsleyes.panel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.lightboxeditprofile.rst b/doc/fsl.fsleyes.profiles.lightboxeditprofile.rst
new file mode 100644
index 0000000000000000000000000000000000000000..bf8147bf8658aa84917d576e903eabbe65355b8d
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.lightboxeditprofile.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.profiles.lightboxeditprofile module
+===============================================
+
+.. automodule:: fsl.fsleyes.profiles.lightboxeditprofile
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.lightboxviewprofile.rst b/doc/fsl.fsleyes.profiles.lightboxviewprofile.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7fe1c4a68990d5f31dd06e12574ba9b730940c46
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.lightboxviewprofile.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.profiles.lightboxviewprofile module
+===============================================
+
+.. automodule:: fsl.fsleyes.profiles.lightboxviewprofile
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.orthoeditprofile.rst b/doc/fsl.fsleyes.profiles.orthoeditprofile.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e2641a6f489fce8bebd801bd4f0341b169d73824
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.orthoeditprofile.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.profiles.orthoeditprofile module
+============================================
+
+.. automodule:: fsl.fsleyes.profiles.orthoeditprofile
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.orthoviewprofile.rst b/doc/fsl.fsleyes.profiles.orthoviewprofile.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ee6f874981f009f88eeee4c28823589094ea23fa
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.orthoviewprofile.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.profiles.orthoviewprofile module
+============================================
+
+.. automodule:: fsl.fsleyes.profiles.orthoviewprofile
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.profilemap.rst b/doc/fsl.fsleyes.profiles.profilemap.rst
new file mode 100644
index 0000000000000000000000000000000000000000..52e1040685394c2d5990c2db15c13d5d9a27a9fe
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.profilemap.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.profiles.profilemap module
+======================================
+
+.. automodule:: fsl.fsleyes.profiles.profilemap
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.profiles.rst b/doc/fsl.fsleyes.profiles.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6e9ba77c48a33da45ccb66763c7b9e5c69a4a4d8
--- /dev/null
+++ b/doc/fsl.fsleyes.profiles.rst
@@ -0,0 +1,21 @@
+fsl.fsleyes.profiles package
+============================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.profiles.lightboxeditprofile
+   fsl.fsleyes.profiles.lightboxviewprofile
+   fsl.fsleyes.profiles.orthoeditprofile
+   fsl.fsleyes.profiles.orthoviewprofile
+   fsl.fsleyes.profiles.profilemap
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.profiles
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.rst b/doc/fsl.fsleyes.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ed5a37489f37393334f3b0cfb2d1ce967176cc1e
--- /dev/null
+++ b/doc/fsl.fsleyes.rst
@@ -0,0 +1,39 @@
+fsl.fsleyes package
+===================
+
+Subpackages
+-----------
+
+.. toctree::
+
+    fsl.fsleyes.actions
+    fsl.fsleyes.controls
+    fsl.fsleyes.displaycontext
+    fsl.fsleyes.editor
+    fsl.fsleyes.gl
+    fsl.fsleyes.profiles
+    fsl.fsleyes.views
+    fsl.fsleyes.widgets
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.colourmaps
+   fsl.fsleyes.frame
+   fsl.fsleyes.fsleyes_parseargs
+   fsl.fsleyes.icons
+   fsl.fsleyes.overlay
+   fsl.fsleyes.panel
+   fsl.fsleyes.splash
+   fsl.fsleyes.toolbar
+   fsl.fsleyes.tooltips
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.splash.rst b/doc/fsl.fsleyes.splash.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2eb8073f1cfaca68970de45524205e441cf8b785
--- /dev/null
+++ b/doc/fsl.fsleyes.splash.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.splash module
+=========================
+
+.. automodule:: fsl.fsleyes.splash
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.toolbar.rst b/doc/fsl.fsleyes.toolbar.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e654187ff5d16645a443ba32886b38db8203ba5e
--- /dev/null
+++ b/doc/fsl.fsleyes.toolbar.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.toolbar module
+==========================
+
+.. automodule:: fsl.fsleyes.toolbar
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.tooltips.rst b/doc/fsl.fsleyes.tooltips.rst
new file mode 100644
index 0000000000000000000000000000000000000000..02775fd8a3135dc8c3c826f9581ca0a2d3466d06
--- /dev/null
+++ b/doc/fsl.fsleyes.tooltips.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.tooltips module
+===========================
+
+.. automodule:: fsl.fsleyes.tooltips
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.canvaspanel.rst b/doc/fsl.fsleyes.views.canvaspanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4306349b7876b3265bed46ff436de3dcb1fe813e
--- /dev/null
+++ b/doc/fsl.fsleyes.views.canvaspanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.canvaspanel module
+====================================
+
+.. automodule:: fsl.fsleyes.views.canvaspanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.colourbarpanel.rst b/doc/fsl.fsleyes.views.colourbarpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8a712614bf96584c73b18d920ed298fb8119a17c
--- /dev/null
+++ b/doc/fsl.fsleyes.views.colourbarpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.colourbarpanel module
+=======================================
+
+.. automodule:: fsl.fsleyes.views.colourbarpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.histogrampanel.rst b/doc/fsl.fsleyes.views.histogrampanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4a1ba6a985655d8eedd34f7fc3d294f6304ee0f2
--- /dev/null
+++ b/doc/fsl.fsleyes.views.histogrampanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.histogrampanel module
+=======================================
+
+.. automodule:: fsl.fsleyes.views.histogrampanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.lightboxpanel.rst b/doc/fsl.fsleyes.views.lightboxpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9a8767b08ed4b14671b978b5282201f2c9c1ec9e
--- /dev/null
+++ b/doc/fsl.fsleyes.views.lightboxpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.lightboxpanel module
+======================================
+
+.. automodule:: fsl.fsleyes.views.lightboxpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.orthopanel.rst b/doc/fsl.fsleyes.views.orthopanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f8846fbb53d125a785af3cb38b453004be6c5df0
--- /dev/null
+++ b/doc/fsl.fsleyes.views.orthopanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.orthopanel module
+===================================
+
+.. automodule:: fsl.fsleyes.views.orthopanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.plotpanel.rst b/doc/fsl.fsleyes.views.plotpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4a67d0984ce4c9189ff2e8caf306854a946cceb5
--- /dev/null
+++ b/doc/fsl.fsleyes.views.plotpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.plotpanel module
+==================================
+
+.. automodule:: fsl.fsleyes.views.plotpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.rst b/doc/fsl.fsleyes.views.rst
new file mode 100644
index 0000000000000000000000000000000000000000..5272be82a0a39c525e71f86917d3c0a6f78d127b
--- /dev/null
+++ b/doc/fsl.fsleyes.views.rst
@@ -0,0 +1,24 @@
+fsl.fsleyes.views package
+=========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.views.canvaspanel
+   fsl.fsleyes.views.colourbarpanel
+   fsl.fsleyes.views.histogrampanel
+   fsl.fsleyes.views.lightboxpanel
+   fsl.fsleyes.views.orthopanel
+   fsl.fsleyes.views.plotpanel
+   fsl.fsleyes.views.timeseriespanel
+   fsl.fsleyes.views.viewpanel
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.views
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.timeseriespanel.rst b/doc/fsl.fsleyes.views.timeseriespanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e2916db498ef2241c9d5ba00960da9f7b13db86a
--- /dev/null
+++ b/doc/fsl.fsleyes.views.timeseriespanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.timeseriespanel module
+========================================
+
+.. automodule:: fsl.fsleyes.views.timeseriespanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.views.viewpanel.rst b/doc/fsl.fsleyes.views.viewpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3a2c7b9400e6a30f18539a20179ea865b9bae288
--- /dev/null
+++ b/doc/fsl.fsleyes.views.viewpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.views.viewpanel module
+==================================
+
+.. automodule:: fsl.fsleyes.views.viewpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.widgets.imagepanel.rst b/doc/fsl.fsleyes.widgets.imagepanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2bf10aa2811fc6ddcef59affcd78f6edd324c85e
--- /dev/null
+++ b/doc/fsl.fsleyes.widgets.imagepanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.widgets.imagepanel module
+=====================================
+
+.. automodule:: fsl.fsleyes.widgets.imagepanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.widgets.rst b/doc/fsl.fsleyes.widgets.rst
new file mode 100644
index 0000000000000000000000000000000000000000..18cbb7ab1718e4924ceb5b2e2656ce96ecca9b90
--- /dev/null
+++ b/doc/fsl.fsleyes.widgets.rst
@@ -0,0 +1,20 @@
+fsl.fsleyes.widgets package
+===========================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.fsleyes.widgets.imagepanel
+   fsl.fsleyes.widgets.swappanel
+   fsl.fsleyes.widgets.textpanel
+   fsl.fsleyes.widgets.togglepanel
+
+Module contents
+---------------
+
+.. automodule:: fsl.fsleyes.widgets
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.widgets.swappanel.rst b/doc/fsl.fsleyes.widgets.swappanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..98b82566f137043c12b7e3a59f676f8c7c20a199
--- /dev/null
+++ b/doc/fsl.fsleyes.widgets.swappanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.widgets.swappanel module
+====================================
+
+.. automodule:: fsl.fsleyes.widgets.swappanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.widgets.textpanel.rst b/doc/fsl.fsleyes.widgets.textpanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4586223ebbcc2b902420219a346351dc6c92fdc8
--- /dev/null
+++ b/doc/fsl.fsleyes.widgets.textpanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.widgets.textpanel module
+====================================
+
+.. automodule:: fsl.fsleyes.widgets.textpanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.fsleyes.widgets.togglepanel.rst b/doc/fsl.fsleyes.widgets.togglepanel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fc3d3355935d65b98d6a82cd60291bb186075c83
--- /dev/null
+++ b/doc/fsl.fsleyes.widgets.togglepanel.rst
@@ -0,0 +1,7 @@
+fsl.fsleyes.widgets.togglepanel module
+======================================
+
+.. automodule:: fsl.fsleyes.widgets.togglepanel
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.rst b/doc/fsl.rst
new file mode 100644
index 0000000000000000000000000000000000000000..378faff43e99542ddb72385ada3ace232bf32525
--- /dev/null
+++ b/doc/fsl.rst
@@ -0,0 +1,7 @@
+fsl package
+===========
+
+.. automodule:: fsl
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.bet.rst b/doc/fsl.tools.bet.rst
new file mode 100644
index 0000000000000000000000000000000000000000..bec2980fb3c39f3724643fa3ecfa6c8f3454c93b
--- /dev/null
+++ b/doc/fsl.tools.bet.rst
@@ -0,0 +1,7 @@
+fsl.tools.bet module
+====================
+
+.. automodule:: fsl.tools.bet
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.feat.rst b/doc/fsl.tools.feat.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d8278261fa6a8d700cef7149cb623b249852e2b2
--- /dev/null
+++ b/doc/fsl.tools.feat.rst
@@ -0,0 +1,7 @@
+fsl.tools.feat module
+=====================
+
+.. automodule:: fsl.tools.feat
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.flirt.rst b/doc/fsl.tools.flirt.rst
new file mode 100644
index 0000000000000000000000000000000000000000..5ead319b09d4fc087a28285741752a450c174cd5
--- /dev/null
+++ b/doc/fsl.tools.flirt.rst
@@ -0,0 +1,7 @@
+fsl.tools.flirt module
+======================
+
+.. automodule:: fsl.tools.flirt
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.fsleyes.rst b/doc/fsl.tools.fsleyes.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ac982b860ceadd1fc02b5dc04fc9fa32cb1e9749
--- /dev/null
+++ b/doc/fsl.tools.fsleyes.rst
@@ -0,0 +1,7 @@
+fsl.tools.fsleyes module
+========================
+
+.. automodule:: fsl.tools.fsleyes
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.render.rst b/doc/fsl.tools.render.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9620dbb46d57406b37c7d831a3ece39a927148f7
--- /dev/null
+++ b/doc/fsl.tools.render.rst
@@ -0,0 +1,7 @@
+fsl.tools.render module
+=======================
+
+.. automodule:: fsl.tools.render
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.tools.rst b/doc/fsl.tools.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ac6d8f7772a71872292ae2ccc703877dc003e464
--- /dev/null
+++ b/doc/fsl.tools.rst
@@ -0,0 +1,21 @@
+fsl.tools package
+=================
+
+Submodules
+----------
+
+.. toctree::
+
+   fsl.tools.bet
+   fsl.tools.feat
+   fsl.tools.flirt
+   fsl.tools.fsleyes
+   fsl.tools.render
+
+Module contents
+---------------
+
+.. automodule:: fsl.tools
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.colourbarbitmap.rst b/doc/fsl.utils.colourbarbitmap.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e0f31524e848c4e683eae9957e499e7129b13fe2
--- /dev/null
+++ b/doc/fsl.utils.colourbarbitmap.rst
@@ -0,0 +1,7 @@
+fsl.utils.colourbarbitmap module
+================================
+
+.. automodule:: fsl.utils.colourbarbitmap
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.dialog.rst b/doc/fsl.utils.dialog.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f4b3f7f05caa0541a620310eaa19db5170e5bc41
--- /dev/null
+++ b/doc/fsl.utils.dialog.rst
@@ -0,0 +1,7 @@
+fsl.utils.dialog module
+=======================
+
+.. automodule:: fsl.utils.dialog
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.layout.rst b/doc/fsl.utils.layout.rst
new file mode 100644
index 0000000000000000000000000000000000000000..758023fd12538691514b9c1ec03f82f5d63a1f9d
--- /dev/null
+++ b/doc/fsl.utils.layout.rst
@@ -0,0 +1,7 @@
+fsl.utils.layout module
+=======================
+
+.. automodule:: fsl.utils.layout
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.rst b/doc/fsl.utils.rst
new file mode 100644
index 0000000000000000000000000000000000000000..df2c72c5977421ae90a9548565f68ad535103faf
--- /dev/null
+++ b/doc/fsl.utils.rst
@@ -0,0 +1,7 @@
+fsl.utils package
+=================
+
+.. automodule:: fsl.utils
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.runwindow.rst b/doc/fsl.utils.runwindow.rst
new file mode 100644
index 0000000000000000000000000000000000000000..609fefee4be7b10e8ecffb57869d571ef69d2fe1
--- /dev/null
+++ b/doc/fsl.utils.runwindow.rst
@@ -0,0 +1,7 @@
+fsl.utils.runwindow module
+==========================
+
+.. automodule:: fsl.utils.runwindow
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.settings.rst b/doc/fsl.utils.settings.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3135a22e86228c07d7d53d9fc794b64afe87d098
--- /dev/null
+++ b/doc/fsl.utils.settings.rst
@@ -0,0 +1,7 @@
+fsl.utils.settings module
+=========================
+
+.. automodule:: fsl.utils.settings
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.textbitmap.rst b/doc/fsl.utils.textbitmap.rst
new file mode 100644
index 0000000000000000000000000000000000000000..0a7b8390153a9b8430950d14118ebad5ab707069
--- /dev/null
+++ b/doc/fsl.utils.textbitmap.rst
@@ -0,0 +1,7 @@
+fsl.utils.textbitmap module
+===========================
+
+.. automodule:: fsl.utils.textbitmap
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.trace.rst b/doc/fsl.utils.trace.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b57328b93933a9e0b8e186b4db72a9568a2aaafa
--- /dev/null
+++ b/doc/fsl.utils.trace.rst
@@ -0,0 +1,7 @@
+fsl.utils.trace module
+======================
+
+.. automodule:: fsl.utils.trace
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.transform.rst b/doc/fsl.utils.transform.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2b9cb7064cd81b37d4e5fad3a02c64dad2ab3ac6
--- /dev/null
+++ b/doc/fsl.utils.transform.rst
@@ -0,0 +1,7 @@
+fsl.utils.transform module
+==========================
+
+.. automodule:: fsl.utils.transform
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.typedict.rst b/doc/fsl.utils.typedict.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c1a3b7d63797604ab530bf210279cac578abd66c
--- /dev/null
+++ b/doc/fsl.utils.typedict.rst
@@ -0,0 +1,7 @@
+fsl.utils.typedict module
+=========================
+
+.. automodule:: fsl.utils.typedict
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/fsl.utils.webpage.rst b/doc/fsl.utils.webpage.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fb391ef0885ee483acf75dfe30582deed7771abb
--- /dev/null
+++ b/doc/fsl.utils.webpage.rst
@@ -0,0 +1,7 @@
+fsl.utils.webpage module
+========================
+
+.. automodule:: fsl.utils.webpage
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/images/colourbarbitmap.png b/doc/images/colourbarbitmap.png
new file mode 100644
index 0000000000000000000000000000000000000000..a94c44e75d587321f1c585f429bf491727e17934
Binary files /dev/null and b/doc/images/colourbarbitmap.png differ
diff --git a/doc/images/fsldirdialog.png b/doc/images/fsldirdialog.png
new file mode 100644
index 0000000000000000000000000000000000000000..4641d8b30fa34feec9d45eb1a41a5fc8731c52c2
Binary files /dev/null and b/doc/images/fsldirdialog.png differ
diff --git a/doc/images/simplemessagedialog.png b/doc/images/simplemessagedialog.png
new file mode 100644
index 0000000000000000000000000000000000000000..01771580c87137b9ffa16434aa2c9ced59bd7c73
Binary files /dev/null and b/doc/images/simplemessagedialog.png differ
diff --git a/doc/images/texteditdialog.png b/doc/images/texteditdialog.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2001ae7f2d53abacea0d485bfeb30f3c90df221
Binary files /dev/null and b/doc/images/texteditdialog.png differ
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..205da6eda548a656d690d970a1a8503b8a516f4f
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,15 @@
+``fslpy``
+=========
+
+
+.. toctree::
+   :hidden:
+   :maxdepth: 1
+
+   fsl.tools
+   fsl.data
+   fsl.utils
+   fsl.fsleyes
+
+   
+This is the ``fslpy`` package.
diff --git a/fsl/utils/__init__.py b/fsl/utils/__init__.py
index 058ddca064db3f3aee5fdf26a404395330e0e210..f9ebd2106d4c98bf27feb131b4ebc4f67b18b2a2 100644
--- a/fsl/utils/__init__.py
+++ b/fsl/utils/__init__.py
@@ -4,4 +4,20 @@
 #
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
-"""A collection of small utility modules for doing random things."""
+"""This module contains a collection of small utility modules for doing random
+things.
+
+ .. autosummary::
+    :nosignatures:
+
+    ~fsl.utils.settings
+    ~fsl.utils.transform
+    ~fsl.utils.typedict
+    ~fsl.utils.layout
+    ~fsl.utils.colourbarbitmap
+    ~fsl.utils.textbitmap
+    ~fsl.utils.dialog
+    ~fsl.utils.runwindow
+    ~fsl.utils.webpage
+    ~fsl.utils.trace
+"""
diff --git a/fsl/utils/colourbarbitmap.py b/fsl/utils/colourbarbitmap.py
index d9a7a08929bfa972a20d8d5ea6dc3f70da8088c8..25aeed4c3e8ea914b37a10eb896c46d260dee075 100644
--- a/fsl/utils/colourbarbitmap.py
+++ b/fsl/utils/colourbarbitmap.py
@@ -7,7 +7,7 @@
 #
 """This module provides a single function, :func:`colourBarBitmap`, which uses
 :mod:`matplotlib` to plot a colour bar. The colour bar is rendered off-screen
-and returned as an rgba bitmap.
+and returned as an RGBA bitmap.
 """
 
 
@@ -23,11 +23,49 @@ def colourBarBitmap(cmap,
                     fontsize=10,
                     bgColour=None,
                     textColour='#ffffff'):
-    """Plots a colour bar using matplotlib, and returns a RGBA bitmap
-    of the specified width/height.
+    """Plots a colour bar using :mod:`matplotlib`.
 
-    The bitmap is returned as a W*H*4 numpy array, with the top-left
-    pixel located at index ``[0, 0, :]``.
+    
+    The rendered colour bar is returned as a RGBA bitmap within a
+    ``numpy.uint8`` array of size :math:`w \\times h \\times 4`, with the
+    top-left pixel located at index ``[0, 0, :]``.
+
+
+    A rendered colour bar will look something like this:
+
+    .. image:: images/colourbarbitmap.png
+       :scale: 50%
+       :align: center
+    
+    
+    :arg cmap:         Name of a registered :mod:`matplotlib` colour map.
+    
+    :arg vmin:         Data minimum.
+    
+    :arg vmax:         Data minimum.
+    
+    :arg width:        Colour bar width in pixels.
+    
+    :arg height:       Colour bar height in pixels.
+    
+    :arg label:        Text label to show next to the colour bar.
+    
+    :arg orientation:  Either ``vertical`` or `horizontal``.
+    
+    :arg labelside:    If ``orientation`` is ``vertical`` ``labelSide`` may
+                       be either ``left`` or ``right``. Otherwise, if
+                       ``orientation`` is ``horizontal``, ``labelSide`` may
+                       be ``top`` or ``bottom``.
+    
+    :arg alpha:        Colour bar transparency, in the range ``[0.0 - 1.0]``.
+    
+    :arg fontsize:     Label font size in points.
+    
+    :arg bgColour:     Background colour - can be any colour specification
+                       that is accepted by :mod:`matplotlib`.
+    
+    :arg textColour:   Label colour - can be any colour specification that
+                       is accepted by :mod:`matplotlib`.
     """
 
     # These imports are expensive, so we're
diff --git a/fsl/utils/dialog.py b/fsl/utils/dialog.py
index 29969e071a14192f35a8ebc96d7d1eac26d1c2e1..481670e731679acdfbacaf7a9f90fbea2b1aefa7 100644
--- a/fsl/utils/dialog.py
+++ b/fsl/utils/dialog.py
@@ -4,23 +4,70 @@
 #
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
+"""This module contains a collection of basic dialog classes, available for
+use throughout ``fslpy``. The available dialogs are:
+
+.. autosummary::
+   :nosignatures:
+
+   SimpleMessageDialog
+   TimeoutDialog
+   ProcessingDialog
+   TextEditDialog
+   FSLDirDialog
+"""
 
-import wx
 
 import threading
 
+import wx
+
 import fsl.data.strings as strings
 
 
-SMD_KEEP_CENTERED = 1
+class SimpleMessageDialog(wx.Dialog):
+    """A simple, no-frills :class:`wx.Dialog` for displaying a message. The
+    message can be updated via the :meth:`SetMessage` method. As a simple
+    usage example::
 
+        import fsl.utils.dialog as fsldlg
+        dlg = fsldlg.SimpleMessageDialog(message='Loading data ...')
 
-class SimpleMessageDialog(wx.Dialog):
+        dlg.Show()
+    
+        # load the data, like
+        # you said you would
+
+        # Data is loaded, so we
+        # can kill the dialog
+        dlg.Close()
+        dlg.Destroy()
+
+    
+    The ``SimpleMessageDialog`` class supports the following styles:
+
+    .. autosummary::
+       SMD_KEEP_CENTERED
+    
+
+    a ``SimpleMessageDialog`` looks something like this:
+
+    .. image:: images/simplemessagedialog.png
+       :scale: 50%
+       :align: center
+    """
 
     
     def __init__(self, parent=None, message='', style=None):
-        """
-        Style defaults to SMD_KEEP_CENTERED.
+        """Create a ``SimpleMessageDialog``.
+
+        :arg parent:  The :mod:`wx` parent object. 
+
+        :arg message: The initial message to show.
+
+        :arg style:   Only one style flag  is supported,
+                      :data:`SMD_KEEP_CENTERED`. This flag is enabled by
+                      default.
         """
 
         
@@ -58,6 +105,11 @@ class SimpleMessageDialog(wx.Dialog):
 
         
     def SetMessage(self, msg):
+        """Updates the message shown on this ``SimpleMessageDialog``.
+
+        If the :data:`SMD_KEEP_CENTERED` style is set, the dialog is
+        re-centered on its parent, to account for changes in the message width.
+        """
 
         msg = str(msg)
 
@@ -89,45 +141,114 @@ class SimpleMessageDialog(wx.Dialog):
         wx.Yield()
             
 
-
 class TimeoutDialog(SimpleMessageDialog):
+    """A :class:`SimpleMessageDialog` which automatically destroys itself
+    after a specified timeout period.
+
+     .. note:: The timeout functionality will not work if you show the dialog
+               by any means other than the :meth:`wx.Dialog.Show` or
+               :meth:`wx.Dialog.ShowModal` methods ... but is there any other
+               way of showing a :class:`wx.Dialog`?
+    """
 
 
     def __init__(self, parent, message, timeout=1000, **kwargs):
+        """Create a ``TimeoutDialog``.
+
+        :arg parent:  The :mod:`wx` parent object.
+
+        :arg message: The initial message to display.
+
+        :arg timeout: Timeout period in milliseconds. 
+
+        :arg kwargs:  Passed through to :meth:`SimpleMessageDialog.__init__`.
+        """
 
         SimpleMessageDialog.__init__(self, parent, message, **kwargs)
         self.__timeout = timeout
 
 
     def __close(self):
+        """Closes and destroys this ``TimeoutDialog``. """
         self.Close()
         self.Destroy()
 
         
     def Show(self):
+        """Shows this ``TimeoutDialog``, and sets up a callback to
+        close it after the specified ``timeout``.
+        """
         wx.CallLater(self.__timeout, self.__close)
         SimpleMessageDialog.Show(self)
 
 
     def ShowModal(self):
+        """Shows this ``TimeoutDialog``, and sets up a callback to
+        close it after the specified ``timeout``.
+        """ 
         wx.CallLater(self.__timeout, self.__close)
         SimpleMessageDialog.ShowModal(self)
 
         
 class ProcessingDialog(SimpleMessageDialog):
+    """A :class:`SimpleMessageDialog` which displays a message and runs a
+    task in the background. User interaction is blocked while the task runs,
+    and the dialog closes and destroys itself automatically on task
+    completion.
+
+    
+    The task is simply passed in as a function. If the task supports it,
+    the ``ProcessingDialog`` will pass it two message-updating functions,
+    which can be used by the task to update the message being displayed.
+    This functionality is controlled by the ``passFuncs``, ``messageFunc``
+    and ``errorFunc`` parameters to :meth:`__init__`.
+
+    
+    A ``ProcessingDialog`` must be displayed via the :meth:`Run` method,
+    *not* with the :meth:`wx.Dialog.Show` or :meth:`wx.Dialog.ShowModal`
+    methods.
+    """
 
     def __init__(self, parent, message, task, *args, **kwargs):
-        """
+        """Create a ``ProcessingDialog``.
+
+        :arg parent:       The :mod:`wx` parent object.
         
-        :arg message:
+        :arg message:      Initial message to display.
         
-        :arg task: 
+        :arg task:         The function to run.
 
-        :arg passFuncs:
+        :arg args:         Positional arguments passed to the ``task``
+                           function.
 
-        :arg messageFunc:
+        :arg kwargs:       Keyword arguments passed to the ``task`` function.
 
-        :arg errorFunc:
+        
+        Some special keyword arguments are also accepted:
+
+        ===============  =================================================
+        Name             Description
+        ===============  =================================================
+        ``passFuncs``    If ``True``, two extra keyword arguments  are
+                         passed to the ``task`` function - ``messageFunc``
+                         and ``errorFunc``.
+
+                         ``messageFunc`` is a function which accepts a
+                         single string as its argument; when it is called,
+                         the dialog  message is updated to display the
+                         string.
+
+                         ``errorFunc`` is a function which accepts two
+                         arguemnts - a message string and an
+                         :exc:`Exception` instance. If the task detects
+                         an error, it may call this function. A new
+                         dialog is shown, containing the details of the
+                         error, to inform the user.
+        ``messageFunc``  Overrides the default ``messageFunc`` described
+                         above.
+        ``errorFunc``    Overrides the default ``errorFunc`` described
+                         above.
+        ===============  =================================================
         """
 
         passFuncs = kwargs.get('passFuncs', False)
@@ -152,15 +273,24 @@ class ProcessingDialog(SimpleMessageDialog):
 
 
     def Run(self, mainThread=False):
-        """
+        """Shows this ``ProcessingDialog``, and runs the ``task`` function
+        passed to :meth:`__init__`. When the task completes, this dialog
+        is closed and destroyed.
+
+        :arg mainThread: If ``True`` the task is run in the current thread.
+                         Otherwise, the default behaviour is to run the
+                         task in a separate thread.
 
-        If mainThread=True, the task should call wx.Yield periodically
-        (under GTK, there is a chance that the ProcessingDialog will not
-        get drawn before the task begins).
+        :returns: the return value of the ``task`` function.
+
+        .. note:: If ``mainThread=True``, the task should call
+                  :func:`wx.Yield` periodically - under GTK, there is a
+                  chance that this ``ProcessingDialog`` will not get drawn
+                  before the task begins.
         """
 
         self.SetMessage(self.message)
-        self.Show()
+        wx.Dialog.Show(self)
         self.SetFocus()
 
         self.Refresh()
@@ -199,29 +329,54 @@ class ProcessingDialog(SimpleMessageDialog):
         
         return result
 
+    
+    def Show(self):
+        """Raises a :exc:`NotImplementedError`."""
+        raise NotImplementedError('Use the Run method')
+
+    
+    def ShowModal(self):
+        """Raises a :exc:`NotImplementedError`."""
+        raise NotImplementedError('Use the Run method') 
+
         
     def __defaultMessageFunc(self, msg):
+        """Default ``messageFunc``. Updates the message which is displayed
+        on this ``ProcessingDialog``. See :meth:`SetMessage`.
+        """
         self.SetMessage(msg)
 
     
     def __defaultErrorFunc(self, msg, err):
+        """Default ``errorFunc``. Opens a new dialog (a :class:`wx.MessageBox`)
+        which contains a description of the error.
+        """
         err   = str(err)
         msg   = strings.messages[self, 'error'].format(msg, err)
         title = strings.titles[  self, 'error']
         wx.MessageBox(msg, title, wx.ICON_ERROR | wx.OK) 
 
 
+class TextEditDialog(wx.Dialog):
+    """A dialog which shows an editable/selectable text field.
 
-TED_READONLY  = 1
-TED_MULTILINE = 2
-TED_OK        = 4
-TED_CANCEL    = 8
-TED_OK_CANCEL = 12
-TED_COPY      = 16
 
+    ``TextEditDialog`` supports the following styles:
 
-class TextEditDialog(wx.Dialog):
-    """A dialog which shows an editable/selectable text field."""
+    .. autosummary::
+       TED_READONLY
+       TED_MULTILINE
+       TED_OK
+       TED_CANCEL
+       TED_OK_CANCEL
+       TED_COPY
+
+    A ``TextEditDialog`` looks something like this:
+
+    .. image:: images/texteditdialog.png
+       :scale: 50%
+       :align: center
+    """
 
     def __init__(self,
                  parent,
@@ -229,7 +384,28 @@ class TextEditDialog(wx.Dialog):
                  message='',
                  text='',
                  icon=None,
-                 style=TED_OK):
+                 style=None):
+        """Create a ``TextEditDialog``.
+
+        :arg parent:  The :mod:`wx` parent object.
+
+        :arg title:   Dialog title.
+        
+        :arg message: Dialog message.
+        
+        :arg text:    String  to display in the text field.
+        
+        :arg icon:    A :mod:`wx` icon identifier, such as 
+                      :data:`wx.ICON_INFORMATION` or :data:`wx.ICON_WARNING`.
+        
+        :arg style:   A combination of :data:`TED_READONLY`,
+                      :data:`TED_MULTILINE`, :data:`TED_OK`, 
+                      :data:`TED_CANCEL`, :data:`TED_OK_CANCEL`, and
+                      :data:`TED_COPY`. Defaults to :data:`TED_OK`.
+        """
+
+        if style is None:
+            style = TED_OK
 
         wx.Dialog.__init__(self,
                            parent,
@@ -311,14 +487,20 @@ class TextEditDialog(wx.Dialog):
 
         
     def __onOk(self, ev):
+        """Called when the *Ok* button is pressed. Ends the dialog. """
         self.EndModal(wx.ID_OK)
 
         
     def __onCancel(self, ev):
+        """Called when the *Cancel* button is pressed. Ends the dialog. """
         self.EndModal(wx.ID_CANCEL)
 
         
     def __onCopy(self, ev):
+        """Called when the *Copy* button is pressed. Copies the text
+        to the system clipboard, and pops up a :class:`TimeoutDialog`
+        informing the user.
+        """
         text = self.__textEdit.GetValue()
 
         cb = wx.TheClipboard
@@ -331,31 +513,57 @@ class TextEditDialog(wx.Dialog):
 
             
     def SetMessage(self, message):
+        """Set the message displayed on the dialog."""
         self.__message.SetLabel(message)
 
         
     def SetOkLabel(self, label):
+        """Set the label to show on the *Ok* button."""
         self.__ok.SetLabel(label)
 
+        
     def SetCopyLabel(self, label):
+        """Sets the label to show on the *Copy* button."""
         self.__copy.SetLabel(label)
 
         
     def SetCancelLabel(self, label):
+        """Sets the label to show on the *Cancel* button."""
         self.__cancel.SetLabel(label)
 
 
     def SetText(self, text):
+        """Sets the text to show in the text field."""
         self.__textEdit.SetValue(text)
 
 
     def GetText(self):
+        """Returns the text shown in the text field."""
         return self.__textEdit.GetValue()
 
 
 class FSLDirDialog(wx.Dialog):
+    """A dialog which warns the user that the ``$FSLDIR`` environment
+    variable is not set, and prompts them to identify the FSL
+    installation directory.
+
+    If the user selects a directory, the :meth:`getFSLDir` method can be
+    called to retrieve their selection after the dialog has been closed.
+
+    A ``FSLDirDialog`` looks something like this:
+
+    .. image:: images/fsldirdialog.png
+       :scale: 50%
+       :align: center
+    """
 
     def __init__(self, parent, toolName):
+        """Create a ``FSLDirDialog``.
+
+        :arg parent:   The :mod:`wx` parent object.
+
+        :arg toolName: The name of the tool which is running.
+        """
 
         wx.Dialog.__init__(self, parent, title=strings.titles[self])
 
@@ -382,7 +590,8 @@ class FSLDirDialog(wx.Dialog):
         self.__labelSizer  = wx.BoxSizer(wx.HORIZONTAL)
         self.__buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
 
-        self.__labelSizer.Add(self.__icon, flag=wx.ALL | wx.CENTRE,
+        self.__labelSizer.Add(self.__icon,
+                              flag=wx.ALL | wx.CENTRE,
                               border=20)
         self.__labelSizer.Add(self.__message,
                               flag=wx.ALL | wx.CENTRE,
@@ -392,31 +601,39 @@ class FSLDirDialog(wx.Dialog):
         self.__buttonSizer.AddStretchSpacer()
         self.__buttonSizer.Add(self.__locate,
                                flag=wx.ALL | wx.CENTRE,
-                               border=10,
-                               proportion=1)
+                               border=10)
         self.__buttonSizer.Add(self.__skip,
-                               flag=wx.ALL | wx.CENTRE,
-                               border=10,
-                               proportion=1)
-        self.__buttonSizer.Add((20, -1))
+                               flag=(wx.TOP    |
+                                     wx.RIGHT  |
+                                     wx.BOTTOM |
+                                     wx.CENTRE),
+                               border=10)
+        self.__buttonSizer.Add((-1, 20))
 
         self.__sizer.Add(self.__labelSizer,  flag=wx.EXPAND, proportion=1)
         self.__sizer.Add(self.__buttonSizer, flag=wx.EXPAND)
-        self.__sizer.Add((-1, 20))
 
         self.SetSizer(self.__sizer)
         self.Fit()
 
         
     def GetFSLDir(self):
+        """If the user selected a directory, this method returns their
+        selection. Otherwise, it returns ``None``.
+        """
         return self.__fsldir
  
 
     def __onSkip(self, ev):
+        """Called when the *Skip* button is pushed. """
         self.EndModal(wx.ID_CANCEL)
 
 
     def __onLocate(self, ev):
+        """Called when the *Locate* button is pushed. Opens a
+        :class:`wx.DirDialog` which allows the user to locate the
+        FSL installation directory.
+        """
 
         dlg = wx.DirDialog(
             self,
@@ -425,7 +642,46 @@ class FSLDirDialog(wx.Dialog):
 
         if dlg.ShowModal() != wx.ID_OK:
             self.EndModal(wx.ID_CANCEL)
+            return
 
         self.__fsldir = dlg.GetPath()
  
         self.EndModal(wx.ID_OK)
+
+
+# SimpleMessageDialog style flags
+SMD_KEEP_CENTERED = 1
+"""If set, the dialog will be re-centred on its parent whenever its message
+changes.
+"""
+
+
+# TextEditDialog style flags
+
+
+TED_READONLY = 1
+"""If set, the user will not be able to change the text field contents."""
+
+
+TED_MULTILINE = 2
+"""If set, the text field will span multiple lines. """
+
+
+TED_OK = 4
+"""If set, an *Ok* button will be shown. """
+
+
+TED_CANCEL = 8
+"""If set, a *Cancel* button will be shown. """
+
+
+TED_OK_CANCEL = 12
+"""If set, *Ok* and *Cancel* buttons will be shown. Equivalent to
+``TED_OK | TED_CANCEL``.
+"""
+
+
+TED_COPY = 16
+"""If set, a *Copy* button will be shown, allowing the use to copy
+the text to the system clipboard.
+"""
diff --git a/fsl/utils/layout.py b/fsl/utils/layout.py
index 4a2b2a904e39d4660d344b997202264c5ff77d52..03813e69ec4672ca3ff35de5db1c6e4a9cf0d96b 100644
--- a/fsl/utils/layout.py
+++ b/fsl/utils/layout.py
@@ -7,61 +7,54 @@
 #
 """Utility functions for calculating canvas sizes and laying them out.
 
-This module provides functions which implement a simple layout manager, for
-laying out canvases and associated orientation labels. It is used primarily by
-the :mod:`~fsl.tools.render` application, for off-screen rendering.
-
-The main entry points for the layout manager are:
-
-  - :func:`buildOrthoLayout`: Creates a tree of objects representing a group
-                              of canvases laid out either horizontally,
-                              vertically, or in a grid.
-
-  - :func:`layoutToBitmap`:   Converts a layout tree into a rgba bitmap, a
-                              ``numpy.uint8`` array of size
-                              ``(height, width, 4)``.
-
-This module also provides a few functions, for calculating the display size,
-in pixels, of one or more canvases which are displaying a defined coordinate
-system. The canvas sizes are calculated so that their aspect ratio, relative
-to the respective horizontal/vertical display axes, are maintained, and that
-the canvases are sized proportionally with respect to each other. These
-functions are used both by :mod:`~fsl.tools.render`, and also by the
-:class:`.OrthoPanel`, for calculating canvas sizes when they are displayed in
-:mod:`.fsleyes`.
-
-The following size calculation functions are available:
-
-  - :func:`calcGridSizes`:       Calculates canvas sizes for laying out in a
-                                 grid
-  - :func:`calcHorizontalSizes`: Calculates canvas sizes for laying out
-                                 horizontally.
-  - :func:`calcVerticalSizes`:   Calculates canvas sizes for laying out
-                                 vertically.
-
-Each of these functions require the following parameters:
-
-  - ``canvasaxes``: A sequence of 2-tuples, one for each canvas, with each
-                    tuple specifying the indices of the coordinate system
-                    axes which map to the horizontal and vertical canvas
-                    axes.
- 
-  - ``bounds``:     A sequence of three floating point values, specifying the
-                    length of each axis in the coordinate system being
-                    displayed.
-
-  - ``width``:      The total available width in which all of the canvases are
-                    to be displayed.
-
-  - ``height``:     The total available height in which all of the canvases are
-                    to be displayed.
-
-A convenience function :func:`calcSizes` is also available which, in addition
-to the above parameters, accepts a string as its first parameter which must be
-equal to one of ``horizontal``, ``vertical``, or ``grid``. It will then call
-the appropriate layout-specific function.
+
+This module implements a simple layout manager, for laying out canvases and
+associated orientation labels. It is used primarily by the :mod:`.render`
+application, for off-screen rendering.
+
+You can use the following classes to define a layout:
+
+.. autosummary::
+   :nosignatures:
+
+   Bitmap
+   Space
+   HBox
+   VBox
+
+
+And the following functions to generate layouts and bitmaps:
+
+.. autosummary::
+   :nosignatures:
+
+   buildOrthoLayout
+   buildCanvasBox
+   padBitmap
+   layoutToBitmap
+
+
+A few functions are also provided for calculating the display size, in pixels,
+of one or more canvases which are displaying a defined coordinate system. The
+canvas sizes are calculated so that their aspect ratio, relative to the
+respective horizontal/vertical display axes, are maintained, and that the
+canvases are sized proportionally with respect to each other. These functions
+are used both by :mod:`.render`, and also by the :class:`.OrthoPanel` and
+:class:`.LightBoxPanel`, for calculating canvas sizes when they are displayed
+in :mod:`.fsleyes`. The following size calculation functions are available:
+
+.. autosummary::
+   :nosignatures:
+
+   calcSizes
+   calcGridSizes
+   calcHorizontalSizes
+   calcVerticalSizes
+   calcPixWidth
+   calcPixHeight
 """
 
+
 import logging
 
 import numpy as np
@@ -70,41 +63,78 @@ import numpy as np
 log = logging.getLogger(__name__)
 
 
-#
-# The Space, Bitmap, HBox and VBox classes are used by a simple
-# layout manager for laying out slice canvases, labels, and colour
-# bars.
-#
-
 class Bitmap(object):
-    """A class which encapsulates a RGBA bitmap (a ``numpy.uint8`` array of
-    shape ``(height, width, 4)``)
+    """A class which encapsulates a RGBA bitmap, assumed to be a
+    ``numpy.uint8`` array of shape :math:`height \\times width \\times 4`).
+
+    .. warning:: Note the unusual array shape - height is the first axis,
+                 and width the second!
+
+    
+    A ``Bitmap`` instance has the following attributes:
+
+      - ``bitmap``: The bitmap data
+      - ``width``:  Bitmap width in pixels
+      - ``height``: Bitmap height in pixels
     """
 
     def __init__(self, bitmap):
+        """Create a ``Bitmap``.
+
+        :arg bitmap: :mod:`numpy` array containing the bitmap data.
+        """
         self.bitmap = bitmap
         self.width  = bitmap.shape[1]
         self.height = bitmap.shape[0]
 
         
 class Space(object):
-    """A class which represents empty space of a specific width/height. """
+    """A class which represents empty space of a specific width/height.
+
+    
+    A ``Space`` instance has the following attributes:
+
+      - ``width``:  Width in pixels.
+      - ``height``: Height in pixels.
+    """
 
     def __init__(self, width, height):
+        """Creat a ``Space``.
+
+        :arg width:  Width in pixels.
+
+        :arg height: Height in pixels.
+        """
         self.width  = width
         self.height = height
 
         
 class HBox(object):
-    """A class which contains items to be laid out horizontally. """
+    """A class which contains items to be laid out horizontally.
+
+    After creation, new items should be added via the :meth:`append` method.
+
+    A ``HBox`` instance has the following attributes:
+
+      - ``width``:  Total width in pixels.
+      - ``height``: Total height in pixels.
+      - ``items``:  List of items in this ``HBox``.
+    """
+
+    
     def __init__(self, items=None):
+        """Create a ``HBox``.
+
+        :arg items: List of items contained in this ``HBox``.
+        """
         self.width  = 0
         self.height = 0
-        self.items = []
+        self.items  = []
         if items is not None: map(self.append, items)
 
         
     def append(self, item):
+        """Append a new item to this ``HBox``. """
         self.items.append(item)
         self.width = self.width + item.width
         if item.height > self.height:
@@ -112,14 +142,30 @@ class HBox(object):
 
             
 class VBox(object):
-    """A class which contains items to be laid out vertically. """
+    """A class which contains items to be laid out vertically.
+
+    After creation, new items can be added via the :meth:`append` method.
+
+    A ``VBox`` instance has the following attributes:
+
+      - ``width``:  Total width in pixels.
+      - ``height``: Total height in pixels.
+      - ``items``:  List of items in this ``VBox``.    
+    """
+    
     def __init__(self, items=None):
+        """Create a ``VBox``.
+
+        :arg items: List of items contained in this ``VBox``.
+        """ 
         self.width  = 0
         self.height = 0
-        self.items = []
+        self.items  = []
         if items is not None: map(self.append, items)
 
+        
     def append(self, item):
+        """Append a new item to this ``VBox``. """
         self.items.append(item)
         self.height = self.height + item.height
         if item.width > self.width:
@@ -127,12 +173,25 @@ class VBox(object):
 
 
 def padBitmap(bitmap, width, height, vert, bgColour):
-    """Pads the given bitmap with zeros along the secondary axis,
-    so that it fits in the given ``width``/``height``.
+    """Pads the given bitmap with zeros along the secondary axis (specified
+    with the ``vert`` parameter), so that it fits in the given
+    ``width``/``height``.
+
+    
+    :arg bitmap:   A ``numpy.array`` of size :math:`x \\times y \\times 4`
+                   containing a RGBA bitmap.
+    
+    :arg width:    Desired width in pixels.
+    
+    :arg height:   Desired height in pixels.
+    
+    :arg vert:     If ``vert`` is ``True``, the bitmap is padded 
+                   horizontally to fit ``width``. Otherwise, the 
+                   bitmap is padded vertically to fit ``height``.
 
-    If ``vert`` is ``True``, the bitmap is padded horizontally to
-    fit ``width``. Otherwise, the bitmap is padded vertically to
-    fit ``height``.
+    :arg bgColour: Background colour to use for padding. Must be
+                   a ``(r, g, b, a)`` tuple with each channel in
+                   the range ``[0 - 255]``.
     """
     
     iheight = bitmap.shape[0]
@@ -163,30 +222,31 @@ def padBitmap(bitmap, width, height, vert, bgColour):
 def layoutToBitmap(layout, bgColour):
     """Recursively turns the given ``layout`` object into a bitmap.
 
-    The ``layout`` object is assumed to be one of the following:
-      - a :class:`Bitmap` object
-      - a :class:`Space` object
-      - a :class:`HBox` object
-      - a :class:`VBox` object
+    :arg layout:   A :class:`Bitmap`, :class:`Space`, :class:`HBox` or 
+                   :class:`VBox` instance.
+
+    :arg bgColour: Background colour used to fill in empty space. Must be
+                   a ``(r, g, b, a)`` tuple with channel values in the range
+                   ``[0, 255]``. Defaults to transparent.
 
-    The generated bitmap is returned as a ``numpy.uint8`` array of shape
-    ``(height, width, 4)``.
+    :returns:      a ``numpy.uint8`` array of size
+                   :math:`height \\times width \\times 4`.
     """
 
     if bgColour is None: bgColour = [0, 0, 0, 0]
     bgColour = np.array(bgColour, dtype=np.uint8)
 
+    # Space is easy 
     if isinstance(layout, Space):
         space = np.zeros((layout.height, layout.width, 4), dtype=np.uint8)
         space[:] = bgColour
         return space
-    
+
+    # Bitmap is easy
     elif isinstance(layout, Bitmap):
         return np.array(layout.bitmap, dtype=np.uint8)
 
-    # Otherwise it's assumed that the
-    # layout object is a HBox or VBox
-
+    # Boxes require a bit of work
     if   isinstance(layout, HBox): vert = False
     elif isinstance(layout, VBox): vert = True
 
@@ -206,12 +266,27 @@ def layoutToBitmap(layout, bgColour):
     else:    return np.hstack(itemBmps)
 
 
-def buildCanvasBox(canvasBmp,
-                   labelBmps,
-                   showLabels,
-                   labelSize):
+def buildCanvasBox(canvasBmp, labelBmps, showLabels, labelSize):
     """Builds a layout containing the given canvas bitmap, and orientation
     labels (if ``showLabels`` is ``True``).
+
+    
+    :arg canvasBmp:  A ``numpy.uint8`` array containing a bitmap.
+    
+    :arg labelBmps:  Only used if ``showLabels`` is ``True``. ``numpy.uint8``
+                     arrays containing label bitmaps. Must be a
+                     dictionary of ``{side : numpy.uint8}`` mappings,
+                     and must have keys ``top``, ``bottom``, ``left`` and
+                     ``right``.
+    
+    :arg showLabels: If ``True``, the orientation labels provided in
+                     ``labelBmps`` are added to the layout.
+    
+    :arg labelSize:  Label sizes - the ``left``/``right`` label widths,
+                     and ``top``/``bottom`` label heights are padded to this
+                     size using ``Space`` objects.
+
+    :returns:        A :class:`Bitmap`  or :class:`VBox` instance.
     """
 
     if not showLabels: return Bitmap(canvasBmp)
@@ -236,8 +311,19 @@ def buildOrthoLayout(canvasBmps,
                      layout,
                      showLabels,
                      labelSize):
-    """Builds a layout tree containinbg the given canvas bitmaps, label
-    bitmaps, and colour bar bitmap.
+    """Builds a layout containing the given canvas bitmaps, label bitmaps, and
+    colour bar bitmap.
+
+    
+    :arg canvasBmps: A list of ``numpy.uint8`` arrays containing the canvas
+                     bitmaps to be laid out.
+
+    :arg layout:     One of ``'horizontal'``, ``'vertical'``, or ``'grid'``.
+
+    See the :func:`buildCanvasBox` for details on the other parameters.
+
+    
+    :returns: A :class:`HBox` or :class:`VBox` describing the layout.
     """
 
     if labelBmps is None:
@@ -262,17 +348,32 @@ def buildOrthoLayout(canvasBmps,
     return canvasBox
 
 
-#
-# Size calculation functions 
-#
-
-
 def calcSizes(layout, canvasaxes, bounds, width, height):
     """Convenience function which, based upon whether the `layout` argument
-    is `horizontal`, `vertical`, or `grid`,  respectively calls one of:
+    is ``'horizontal'``, ``'vertical'``, or ``'grid'``,  respectively calls
+    one of:
+    
       - :func:`calcHorizontalSizes`
       - :func:`calcVerticalSizes`
       - :func:`calcGridSizes`
+
+    :arg layout:    String specifying the layout type.
+    
+    :arg canvsaxes: A list of tuples, one for each canvas to be laid out.
+                    Each tuple contains two values, ``(i, j)``, where ``i``
+                    is an index, into ``bounds``, specifying the canvas
+                    width, and ``j`` is an index into ``bounds``, specifying
+                    the canvas height, in the display coordinate system.
+    
+    :arg bounds:    A list of three values specifying the size of the display
+                    space.
+    
+    :arg width:     Maximum width in pixels.
+    
+    :arg height:    Maximum height in pixels.
+
+    :returns:       A list of ``(width, height)`` tuples, one for each canvas,
+                    each specifying the canvas width and height in pixels.
     """
     
     layout = layout.lower()
@@ -301,8 +402,11 @@ def calcGridSizes(canvasaxes, bounds, width, height):
 
        2
 
-    If less than three canvases are specified, they are passed to the
-    :func:`calcHorizontalLayout` function.
+
+    .. note:: If less than three canvases are specified, they are passed to
+              the :func:`calcHorizontalLayout` function.
+
+    See :func:`calcSizes` for details on the arguments.
     """
 
     if len(canvasaxes) < 3:
@@ -334,46 +438,36 @@ def calcGridSizes(canvasaxes, bounds, width, height):
     return sizes
 
 
-def calcPixWidth(wldWidth, wldHeight, pixHeight):
-    """Given the dimensions of a 'world' space to be displayed,
-    and the available height in pixels, calculates and returns
-    the required pixel width.
-    """
-    return _adjustPixelSize(wldWidth,
-                            wldHeight,
-                            pixHeight * (2 ** 32),
-                            pixHeight)[0]
-
-
-def calcPixHeight(wldWidth, wldHeight, pixWidth):
-    """Given the dimensions of a 'world' space to be displayed,
-    and the available width in pixels, calculates and returns
-    the required pixel height.
-    """ 
-    return _adjustPixelSize(wldWidth,
-                            wldHeight,
-                            pixWidth,
-                            pixWidth * (2 ** 32))[1]
-
-
 def calcVerticalSizes(canvasaxes, bounds, width, height):
-    """Calculates the size of up to three canvases so  they are laid out
+    """Calculates the size of up to three canvases so they are laid out
     vertically.
+
+    See :func:`calcSizes` for details on the arguments.
     """
     return _calcFlatSizes(canvasaxes, bounds, width, height, True)
 
 
 def calcHorizontalSizes(canvasaxes, bounds, width, height):
-    """Calculates the size of up to three canvases so  they are laid out
+    """Calculates the size of up to three canvases so they are laid out
     horizontally.
+
+    See :func:`calcSizes` for details on the arguments.
     """ 
     return _calcFlatSizes(canvasaxes, bounds, width, height, False)
 
         
 def _calcFlatSizes(canvasaxes, bounds, width, height, vert=True):
-    """Used by the :func:`calcVerticalSizes` and :func:`calcHorizontalSizes`
-    functions to lay the canvases out vertically (``vert=True``) or
-    horizontally (``vert=False``).
+    """Used by :func:`calcVerticalSizes` and :func:`calcHorizontalSizes`.
+    
+    Calculates the width and height, in pixels, of each canvas.
+
+    :arg vert: If ``True`` the sizes are calculated for a vertical layout;
+               otherwise they are calculated for a horizontal layout.
+
+    See :func:`calcSizes` for details on the other arguments.
+
+    :returns:  A list of ``(width, height)`` tuples, one for each canvas,
+               each specifying the canvas width and height in pixels. 
     """
 
     # Get the canvas dimensions in world space
@@ -402,8 +496,47 @@ def _calcFlatSizes(canvasaxes, bounds, width, height, vert=True):
     return sizes
 
 
+def calcPixWidth(wldWidth, wldHeight, pixHeight):
+    """Given the dimensions of a space to be displayed, and the available
+    height in pixels, calculates the required pixel width.
+
+    :arg wldWidth:   Width of the display coordinate system
+
+    :arg wldHeight:  Height of the display coordinate system
+
+    :arg pixHeight:  Available height in pixels.
+
+    :returns:        The required width in pixels.
+    """
+    return _adjustPixelSize(wldWidth,
+                            wldHeight,
+                            pixHeight * (2 ** 32),
+                            pixHeight)[0]
+
+
+def calcPixHeight(wldWidth, wldHeight, pixWidth):
+    """Given the dimensions of a space to be displayed, and the available
+    width in pixels, calculates the required pixel height.
+
+    :arg wldWidth:   Width of the display coordinate system
+
+    :arg wldHeight:  Height of the display coordinate system
+
+    :arg pixWidth:   Available width in pixels.
+
+    :returns:        The required height in pixels. 
+    """ 
+    return _adjustPixelSize(wldWidth,
+                            wldHeight,
+                            pixWidth,
+                            pixWidth * (2 ** 32))[1]
+
+
+
 def _adjustPixelSize(wldWidth, wldHeight, pixWidth, pixHeight):
-    """Potentially reduces the given pixel width/height such that the
+    """Used by :func:`calcPixelWidth` and :func:`calcPixelHeight`.
+
+    Potentially reduces the given pixel width/height such that the
     display space aspect ratio is maintained.
     """
 
diff --git a/fsl/utils/runwindow.py b/fsl/utils/runwindow.py
index f615ea98a0208c6fed9b46fc6e5c40c0eb7aa425..f344c1483eaeb1e087366844ded4c86ca3556112 100644
--- a/fsl/utils/runwindow.py
+++ b/fsl/utils/runwindow.py
@@ -4,10 +4,20 @@
 #
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
-"""Run a process, display its output in a :class:`RunPanel`.
+"""This module provides classes and functions for running a non-interactive
+process, and displaying its output.
 
-This module has two entry points - the :func:`checkAndRun` function, and the
-:func:`run` function.
+
+This module provides the :class:`RunPanel` and :class:`ProcessManager`
+classes, and a couple of associated convenience functions.
+
+.. autosummary::
+   :nosignatures:
+
+   RunPanel
+   ProcessManager
+   run
+   checkAndRun
 """
 
 import os
@@ -25,20 +35,28 @@ log = logging.getLogger(__name__)
 
 
 class RunPanel(wx.Panel):
-    """A panel which displays a multiline text control, and a couple of buttons
-    along the bottom.
+    """A panel which displays a multiline text control, and a couple of
+    buttons along the bottom. ``RunPanel`` instances are created by the
+    :func:`run` function, and used/controlled by the :class:`ProcessManager`.
+
+
+    One of the buttons is intended to closes the window in which this panel
+    is contained. The second button is intended to terminate the running
+    process. Both buttons are unbound by default, so must be manually
+    configured by the creator.
+    
+
+    The text panel and buttons are available as the following attributes:
+
+      - ``text``:        The text panel.
+      - ``closeButton``: The `Close window` button.
+      - ``killButton``:  The `Terminate process` button.
     """
 
     def __init__(self, parent):
-        """Creates and lays out a text control, and two buttons.
+        """Create a ``RunPanel``.
 
-        One of the buttons is intended to closes the window in which this
-        panel is contained. The second button is intended to terminate the
-        running process. Both buttons are unbound by default, so must be
-        manually bound to callback functions.
-
-        :ivar closeButton: The `Close window` button.
-        :ivar killButton:  The `Terminate process` button.
+        :arg parent: The :mod:`wx` parent object.
         """
         wx.Panel.__init__(self, parent)
 
@@ -69,24 +87,30 @@ class RunPanel(wx.Panel):
 
 
 class ProcessManager(thread.Thread):
-    """A thread which manages the execution of a child process, and capture of its
-    output.
+    """A thread which manages the execution of a child process, and capture
+    of its output.
+
+    The process output is displayed in a :class:`RunPanel` which must be
+    passed to the ``ProcessManager`` on creation.
+
+    The :meth:`termProc` method can be used to terminate the child process
+    before it has completed.
     """
 
     def __init__(self, cmd, parent, runPanel, onFinish):
-        """Create a ProcessManager thread object. Does nothing special.
+        """Create a ``ProcessManager``.
         
         :arg cmd:      String or list of strings, the command to be
                        executed.
         
-        :arg parent:   GUI parent object.
+        :arg parent:   :mod:`wx` parent object.
         
-        :arg runPanel: :class:`RunPanel` object, for displaying the child 
-                       process output.
+        :arg runPanel: A :class:`RunPanel` instance , for displaying the
+                       child process output.
         
         :arg onFinish: Callback function to be called when the process
                        finishes. May be ``None``. Must accept two parameters,
-                       the GUI parent object, and the process return code.
+                       the GUI ``parent`` object, and the process return code.
         """
         thread.Thread.__init__(self, name=cmd[0])
         
@@ -107,10 +131,10 @@ class ProcessManager(thread.Thread):
  
         # Put the command string at the top of the text control
         self.outq.put(' '.join(self.cmd) + '\n\n')
-        wx.CallAfter(self.writeToPanel)
+        wx.CallAfter(self.__writeToPanel)
 
 
-    def writeToPanel(self):
+    def __writeToPanel(self):
         """Reads a string from the output queue, and appends it
         to the :class:`RunPanel`. This method is intended to be
         executed via :func:`wx.CallAfter`.
@@ -152,7 +176,7 @@ class ProcessManager(thread.Thread):
             
             log.debug('Process output: {}'.format(line.strip()))
             self.outq.put(line)
-            wx.CallAfter(self.writeToPanel)
+            wx.CallAfter(self.__writeToPanel)
 
         # When the above for loop ends, it means that the stdout
         # pipe has been broken. But it doesn't mean that the
@@ -165,12 +189,12 @@ class ProcessManager(thread.Thread):
         log.debug(    'Process finished with return code {}'.format(retcode))
         self.outq.put('Process finished with return code {}'.format(retcode))
 
-        wx.CallAfter(self.writeToPanel)
+        wx.CallAfter(self.__writeToPanel)
 
         # Disable the 'terminate' button on the run panel
         def updateKillButton():
 
-            # ignore errors - see writeToPanel
+            # ignore errors - see __writeToPanel
             try:    self.runPanel.killButton.Enable(False)
             except: pass
 
@@ -183,17 +207,14 @@ class ProcessManager(thread.Thread):
         
     def termProc(self):
         """Attempts to kill the running child process."""
-        try:
-            log.debug('Attempting to send SIGTERM to '
-                      'process group with pid {}'.format(self.proc.pid))
-            os.killpg(self.proc.pid, signal.SIGTERM)
-
-            # put a message on the runPanel
-            self.outq.put('\nSIGTERM sent to process\n\n')
-            wx.CallAfter(self.writeToPanel)
-            
-        except:
-            pass  # why am i ignoring errors here?
+        
+        log.debug('Attempting to send SIGTERM to '
+                  'process group with pid {}'.format(self.proc.pid))
+        os.killpg(self.proc.pid, signal.SIGTERM)
+
+        # put a message on the runPanel
+        self.outq.put('\nSIGTERM sent to process\n\n')
+        wx.CallAfter(self.__writeToPanel)
 
 
 def run(name, cmd, parent, onFinish=None, modal=True):
@@ -206,7 +227,8 @@ def run(name, cmd, parent, onFinish=None, modal=True):
     
     :arg parent:   :mod:`wx` parent object.
     
-    :arg modal:    If ``True``, the command frame will be modal.
+    :arg modal:    If ``True``, the frame which contains the ``RunPanel``
+                   will be modal.
 
     :arg onFinish: Function to be called when the process ends. Must
                    accept two parameters - a reference to the :mod:`wx`
@@ -214,7 +236,8 @@ def run(name, cmd, parent, onFinish=None, modal=True):
                    the exit code of the application.
     """
 
-    # Create the GUI - if modal, the easiest approach is to use a wx.Dialog
+    # Create the GUI - if modal, the easiest
+    # approach is to use a wx.Dialog
     if modal:
         frame = wx.Dialog(
             parent,
@@ -252,25 +275,19 @@ def checkAndRun(name,
     informing the user about the errors. Otherwise, the tool is
     executed, and its output shown in a dialog window. Parameters:
     
-    :arg name:      Name of the tool, used in the window title.
     
-    :arg opts:      A :class:`~props.properties.HasProperties` object to be
+    :arg opts:      A :class:`props.HasProperties` object to be
                     validated.
     
-    :arg parent:    :mod:`wx` object to be used as parent.
-    
-    :arg cmdFunc:   Function which takes a
-                    :class:`~props.properties.HasProperties` object, 
-                    and returns a command to be executed (as a list of
-                    strings), which will be passed to the :func:`run`
+    :arg cmdFunc:   Function which takes a :class:`props.HasProperties`
+                    object, and returns a command to be executed (as a 
+                    list of strings), which will be passed to the :func:`run`
                     function.
     
     :arg optLabels: Dictionary containing property ``{name : label}`` mappings.
                     Used in the error dialog, if any options are invalid.
-    
-    :arg modal:     If true, the command window will be modal.
 
-    :arg onFinish:  Function to be called when the process ends.
+    See :func:`run` for details on the other arguments.
     """
 
     errors = opts.validateAll()
diff --git a/fsl/utils/settings.py b/fsl/utils/settings.py
index 4e231e1cf7cbffd6d87205a9a5e167a5c6f5db8e..502af28076cfcf02cd8cadbe9350f6c248c2fdda 100644
--- a/fsl/utils/settings.py
+++ b/fsl/utils/settings.py
@@ -4,12 +4,38 @@
 #
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
+"""This module provides a simple API to :func:`read` and :func:`write`
+persistent application settings.
+
+ .. note:: Currently the configuration management API provided by :mod:`wx`
+           (http://docs.wxwidgets.org/trunk/overview_config.html) is used for
+           storing application settings.  This means that it is not possible
+           to persist settings from a non-GUI application.
+
+           But that's the whole point of this module, to abstract away the
+           underlying persistence method. In the future I will replace
+           ``wx.Config`` with something that does not rely upon the presence
+           of ``wx``.
+"""
+
+
 import logging
 
+
 log = logging.getLogger(__name__)
 
 
+_CONFIG_ID = 'uk.ac.ox.fmrib.fslpy'
+"""The configuration identifier passed to ``wx.Config``. This identifier
+should be the same as the identifier given to the OSX application bundle
+(see https://git.fmrib.ox.ac.uk/paulmc/fslpy_build).
+"""
+
+
 def read(name, default=None):
+    """Reads a setting with the given ``name``, return ``default`` if
+    there is no setting called ``name``.
+    """
 
     try:    import wx
     except: return None
@@ -17,7 +43,7 @@ def read(name, default=None):
     if wx.GetApp() is None:
         return None
 
-    config = wx.Config('uk.ac.ox.fmrib.fslpy')
+    config = wx.Config(_CONFIG_ID)
     
     value = config.Read(name)
 
@@ -29,6 +55,7 @@ def read(name, default=None):
 
 
 def write(name, value):
+    """Writes a setting with the given ``name`` and ``value``.""" 
 
     try:    import wx
     except: return
@@ -37,7 +64,7 @@ def write(name, value):
         return 
 
     value  = str(value)
-    config = wx.Config('uk.ac.ox.fmrib.fslpy')
+    config = wx.Config(_CONFIG_ID)
 
     log.debug('Writing {}: {}'.format(name, value))
 
diff --git a/fsl/utils/textbitmap.py b/fsl/utils/textbitmap.py
index cb12222e6f117b1e062bb7a2a6601631ae26aaa6..3320284b075849e9e8845b707049f1577fe547a8 100644
--- a/fsl/utils/textbitmap.py
+++ b/fsl/utils/textbitmap.py
@@ -6,7 +6,7 @@
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
 """This module provides a single function, :func:`textBitmap`, which renders
-some text using :mod:`matplotlib`, and returns it as an RGBA bitmap.
+some text off-screen using :mod:`matplotlib`, and returns it as an RGBA bitmap.
 """
 
 
@@ -17,6 +17,29 @@ def textBitmap(text,
                fgColour,
                bgColour,
                alpha=1.0):
+    """Draw some text using :mod:`matplotlib`.
+
+
+    The rendered text is returned as a RGBA bitmap within a ``numpy.uint8``
+    array of size :math:`w \\times h \\times 4`, with the top-left pixel
+    located at index ``[0, 0, :]``.
+
+    :arg text:     Text to render.
+    
+    :arg width:    Width in pixels.
+    
+    :arg height:   Height in pixels.
+    
+    :arg fontSize: Font size in points.
+    
+    :arg fgColour: Foreground (text) colour - can be any colour specification
+                   that is accepted by :mod:`matplotlib`.
+    
+    :arg bgColour: Background colour  - can be any colour specification that
+                   is accepted by :mod:`matplotlib`..
+    
+    :arg alpha:    Text transparency, in the range ``[0.0 - 1.0]``.
+    """
 
     # Imports are expensive
     import numpy                           as np
@@ -43,8 +66,8 @@ def textBitmap(text,
             verticalalignment='center',
             horizontalalignment='center',
             transform=ax.transAxes,
-            color=fgColour)
-
+            color=fgColour,
+            alpha=alpha)
 
     try:    fig.tight_layout()
     except: pass