diff --git a/doc/source/index.rst b/doc/source/index.rst
index 0eb535267de0acc45826c3d55115a633ba8b2275..f9d409eebafbd6829448f7e3ad313c0f91530e1b 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -13,7 +13,7 @@ Contents:
 
    members
 
-Indices and tables
+Indexes
 ==================
 
 * :ref:`genindex`
diff --git a/doc/source/modules.rst b/doc/source/modules.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cb57caefee21e0efc35124a00e7ddbfd437c7919
--- /dev/null
+++ b/doc/source/modules.rst
@@ -0,0 +1,7 @@
+pycgtool
+========
+
+.. toctree::
+   :maxdepth: 4
+
+   pycgtool
diff --git a/doc/source/pycgtool.bondset.rst b/doc/source/pycgtool.bondset.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6d1777e136656fe076a9004362637d0a3f43490b
--- /dev/null
+++ b/doc/source/pycgtool.bondset.rst
@@ -0,0 +1,7 @@
+pycgtool.bondset module
+=======================
+
+.. automodule:: pycgtool.bondset
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.forcefield.rst b/doc/source/pycgtool.forcefield.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a25ef72cdb1ff063fde051830cd26e044b92dcdf
--- /dev/null
+++ b/doc/source/pycgtool.forcefield.rst
@@ -0,0 +1,7 @@
+pycgtool.forcefield module
+==========================
+
+.. automodule:: pycgtool.forcefield
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.frame.rst b/doc/source/pycgtool.frame.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f231e7fb01e95e7590f64d3c9350633054cbc159
--- /dev/null
+++ b/doc/source/pycgtool.frame.rst
@@ -0,0 +1,7 @@
+pycgtool.frame module
+=====================
+
+.. automodule:: pycgtool.frame
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.interface.rst b/doc/source/pycgtool.interface.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a724d24229dfb6ed5ebd3a8267bca81f7be77c41
--- /dev/null
+++ b/doc/source/pycgtool.interface.rst
@@ -0,0 +1,7 @@
+pycgtool.interface module
+=========================
+
+.. automodule:: pycgtool.interface
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.mapping.rst b/doc/source/pycgtool.mapping.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7beba67568802a04357c19576f25f8b03846032e
--- /dev/null
+++ b/doc/source/pycgtool.mapping.rst
@@ -0,0 +1,7 @@
+pycgtool.mapping module
+=======================
+
+.. automodule:: pycgtool.mapping
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.parsers.cfg.rst b/doc/source/pycgtool.parsers.cfg.rst
new file mode 100644
index 0000000000000000000000000000000000000000..07faee150804071674b80389d48c631ace04130e
--- /dev/null
+++ b/doc/source/pycgtool.parsers.cfg.rst
@@ -0,0 +1,7 @@
+pycgtool.parsers.cfg module
+===========================
+
+.. automodule:: pycgtool.parsers.cfg
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.parsers.rst b/doc/source/pycgtool.parsers.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e1fea8bc63eac01873b1086edc5c340901688454
--- /dev/null
+++ b/doc/source/pycgtool.parsers.rst
@@ -0,0 +1,17 @@
+pycgtool.parsers package
+========================
+
+Submodules
+----------
+
+.. toctree::
+
+   pycgtool.parsers.cfg
+
+Module contents
+---------------
+
+.. automodule:: pycgtool.parsers
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.rst b/doc/source/pycgtool.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3375064902240b17376bd9a0fa90bfffe6cd2e98
--- /dev/null
+++ b/doc/source/pycgtool.rst
@@ -0,0 +1,30 @@
+pycgtool package
+================
+
+Subpackages
+-----------
+
+.. toctree::
+
+    pycgtool.parsers
+
+Submodules
+----------
+
+.. toctree::
+
+   pycgtool.bondset
+   pycgtool.forcefield
+   pycgtool.frame
+   pycgtool.interface
+   pycgtool.mapping
+   pycgtool.util
+   pycgtool.warnings
+
+Module contents
+---------------
+
+.. automodule:: pycgtool
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.util.rst b/doc/source/pycgtool.util.rst
new file mode 100644
index 0000000000000000000000000000000000000000..973651be3577312643b89a39febd348640cc5928
--- /dev/null
+++ b/doc/source/pycgtool.util.rst
@@ -0,0 +1,7 @@
+pycgtool.util module
+====================
+
+.. automodule:: pycgtool.util
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/pycgtool.warnings.rst b/doc/source/pycgtool.warnings.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cc5e32b5c3eb729415e0ed659dd37785f6ed0895
--- /dev/null
+++ b/doc/source/pycgtool.warnings.rst
@@ -0,0 +1,7 @@
+pycgtool.warnings module
+========================
+
+.. automodule:: pycgtool.warnings
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/pycgtool.py b/pycgtool.py
index c14f0f9a226b522b3bf2f17f056519894f05dcba..0e9695e67bc3a2dff54122ba8620b517a0063119 100755
--- a/pycgtool.py
+++ b/pycgtool.py
@@ -13,7 +13,7 @@ def main(args, config):
     """
     Main function of the program PyCGTOOL.
 
-    Performs the complete AA->CG mapping and outputs a GROMACS forcefield directory.
+    Performs the complete AA->CG mapping and outputs a files dependent on given input.
 
     :param args: Arguments from argparse
     :param config: Configuration dictionary
diff --git a/pycgtool/bondset.py b/pycgtool/bondset.py
index f6c3381d6ef3de47dec53b0d0fe7d9aa578e7007..e678bd4b4f46daa0721f82399503e5953743aa38 100644
--- a/pycgtool/bondset.py
+++ b/pycgtool/bondset.py
@@ -128,15 +128,35 @@ class BondSet:
                     self._create_angles(mol.name, options.generate_dihedrals)
 
     def get_bond_lengths(self, mol, with_constr=False):
+        """
+        Return list of all bond lengths in molecule.  May include constraints.
+
+        :param mol: Molecule name to return bonds for
+        :param with_constr: Include constraints?
+        :return: List of bonds
+        """
         if with_constr:
             return [bond for bond in self._molecules[mol] if len(bond.atoms) == 2]
         else:
             return [bond for bond in self._molecules[mol] if len(bond.atoms) == 2 and bond.fconst < self._fconst_constr_threshold]
 
     def get_bond_length_constraints(self, mol):
+        """
+        Return list of all bond length constraints in molecule.
+
+        :param mol: Molecule name to return bonds for
+        :return: List of bonds
+        """
         return [bond for bond in self._molecules[mol] if len(bond.atoms) == 2 and bond.fconst >= self._fconst_constr_threshold]
 
     def get_bond_angles(self, mol, exclude_triangle=True):
+        """
+        Return list of all bond angles in molecule.
+
+        :param mol: Molecule name to return bonds for
+        :param exclude_triangle: Exclude angles that are part of a triangle?
+        :return: List of bonds
+        """
         angles = [bond for bond in self._molecules[mol] if len(bond.atoms) == 3]
 
         if exclude_triangle:
@@ -154,6 +174,12 @@ class BondSet:
         return angles
 
     def get_bond_dihedrals(self, mol):
+        """
+        Return list of all bond dihedrals in molecule.
+
+        :param mol: Molecule name to return bonds for
+        :return: List of bonds
+        """
         return [bond for bond in self._molecules[mol] if len(bond.atoms) == 4]
 
     def _create_angles(self, mol, gen_dihedrals=False):
@@ -326,6 +352,11 @@ class BondSet:
                                       angle_default_fc=self._angle_default_fc)
 
     def dump_values(self, target_number=100000):
+        """
+        Output measured bond values to files for length, angles and dihedrals.
+
+        :param target_number: Approx number of sample measurements to output.  If None, all samples will be output
+        """
         def transpose(bond_list):
             """
             Transpose a list of bonds containing values and slice to provide target number of rows.
diff --git a/pycgtool/interface.py b/pycgtool/interface.py
index de1064789a5738d2bbee9a6025d04b61b3c83780..97ba5a7f2a2a1fcc44939d5b20b5232104d99c64 100644
--- a/pycgtool/interface.py
+++ b/pycgtool/interface.py
@@ -1,3 +1,6 @@
+"""
+This module contains classes for interaction at the terminal.
+"""
 import collections
 import curses
 import curses.textpad
@@ -7,8 +10,16 @@ import time
 class Options:
     """
     Class to hold program options not specified at the initial command line.
+
+    Values can be queried by indexing as a dictionary or by attribute.  Iterable.
     """
     def __init__(self, default, args=None):
+        """
+        Create Options instance from iterable of keys and default values.
+
+        :param default: Iterable of key, default value pairs (e.g. list of tuples)
+        :param args: Optional program arguments from Argparse, will be displayed in interactive mode
+        """
         self._dict = collections.OrderedDict()
         for key, val in default:
             try:
@@ -221,6 +232,11 @@ class Progress:
         return self
 
     def __next__(self):
+        """
+        Allow iteration over Progress while testing prewhile and postwhile conditions.
+
+        :return: Iteration number
+        """
         if self._postwhile is not None and self._its > 0 and not self._postwhile():
             self._stop()