diff --git a/doc/concepts/decor.rst b/doc/concepts/decor.rst
index 2177775dca3e2aea59e0b2693879584769576bcc..2851e931ec54466e6df6476e1e6b55da7072a62e 100644
--- a/doc/concepts/decor.rst
+++ b/doc/concepts/decor.rst
@@ -26,10 +26,10 @@ The choice of region or locset is reflected in the two broad classes of dynamics
   * :ref:`Stimuli <cablecell-stimuli>`.
   * :ref:`Probes <cablecell-probes>`.
 
-Decorations are described by a **decor** object in Arbor.
-Provides facility for
-* setting properties defined over the whole cell
-* descriptions of dynamics applied to regions and locsets
+Decorations are described by a **decor** object in Arbor. It provides facilities for
+
+  * setting properties defined over the whole cell;
+  * descriptions of dynamics applied to regions and locsets.
 
 .. _cablecell-paint:
 
@@ -177,9 +177,9 @@ can't be overridden at cell or region level.
    :widths: 15, 10, 10
 
    **Ion**,     **name**, **Valence**
-   *Calcium*,   ca,       1
+   *Calcium*,   ca,       2
    *Potassium*,  k,       1
-   *Sodium*,    na,       2
+   *Sodium*,    na,       1
 
 Each ion species has the following properties:
 
@@ -198,7 +198,7 @@ If no reversal potential mechanism is specified for an ion species, the initial
 reversal potential values are maintained for the course of a simulation.
 Otherwise, the mechanism does the work.
 
-but it is subject to some strict restrictions.
+Reversal potential mechanisms are density mechanisms subject to some strict restrictions.
 Specifically, a reversal potential mechanism described in NMODL:
 
 * May not maintain any STATE variables.
@@ -215,7 +215,7 @@ and ionic state.
     mechanism only, that calculates reversal potentials according to concentrations
     that the other mechanisms use and modify.
 
-If a reversal potential mechanism that writes to multiple ions,
+If a reversal potential mechanism writes to multiple ions,
 it must be given for either no ions, or all of the ions it writes.
 
 Arbor's default catalogue includes a *nernst* reversal potential, which is
diff --git a/doc/concepts/labels.rst b/doc/concepts/labels.rst
index cd6a394f905ba696c0ec95a7791fffd73c8774ae..eae960b78b23bf7cd1f16afdae826c980076ea40 100644
--- a/doc/concepts/labels.rst
+++ b/doc/concepts/labels.rst
@@ -575,7 +575,7 @@ Thingification
 
 When a region or locset expression is applied to a cell morphology, it is represented
 as a list of unbranched :term:`cables <cable>` or a set of :term:`locations <mlocation>` on the morphology.
-This process is called ``thingify`` in arbor, because it turns the abstract description
+This process is called ``thingify`` in Arbor, because it turns the abstract description
 of a :term:`region` or a :term:`locset` into an actual 'thing' when it is applied to a real morphology.
 
 .. note::
@@ -644,7 +644,7 @@ and a :ref:`decor <cablecell-decoration>`. The decorations can be painted or pla
 the regions or locsets defined in the label dictionary by referring to their labels.
 
 .. code-block:: python
-   :caption: Example of a lable dictionary in python:
+   :caption: Example of a label dictionary in python:
 
     arbor.label_dict({
       'soma': '(tag 1)',  # soma is every cable with tag 1 in the morphology.
diff --git a/doc/concepts/mechanisms.rst b/doc/concepts/mechanisms.rst
index 4e1d45a169be2888e12a7307543a83a841d97116..14c33b44ba7bcff1fffe7a9f0cae5d260918d7f4 100644
--- a/doc/concepts/mechanisms.rst
+++ b/doc/concepts/mechanisms.rst
@@ -47,7 +47,7 @@ Catalogues provide an interface for querying mechanism metadata, which includes
 
 Arbor provides a default catalogue of mechanisms as well as two other catalogues containing the sets of common mechanisms
 used by the `Allen Institute <https://alleninstitute.org/>`_ and the `Blue Brain Project <https://portal.bluebrain.epfl.ch/>`_.
-(Find the NMODL decsriptions of the `default mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/default>`_,
+(Find the NMODL descriptions of the `default mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/default>`_,
 the `Allen institute mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/allen>`_ and
 the `BBP mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/bbp>`_ at the provided links.)
 
diff --git a/doc/concepts/morphology.rst b/doc/concepts/morphology.rst
index cf5b6758a2e7eec8ac86be045507377568477b50..8a51061de48b6b0eb0c7980445ce5b5092a6279f 100644
--- a/doc/concepts/morphology.rst
+++ b/doc/concepts/morphology.rst
@@ -53,7 +53,7 @@ proper definition for a morphology.
    **Field**,      **Type**,                           **Description**
    ``prox``,       :term:`mpoint`,   the centre and radius of the proximal end.
    ``dist``,       :term:`mpoint`,   the centre and radius of the distal end.
-   ``tag``,        integer,              ":term:`tag` meta-data, can be used to classify segments of the same kind (ex: soma, dendrite, but also arbitrary use-defined groups"
+   ``tag``,        integer,              ":term:`tag` meta-data, can be used to classify segments of the same kind (ex: soma, dendrite, but also arbitrary use-defined groups)"
 
 .. figure:: ../gen-images/term_segments.svg
   :width: 300
@@ -131,7 +131,7 @@ Segment trees
     and tools that iteratively construct cell morphologies (e.g. L-system generators, interactive cell-builders).
 
 Segment trees comprise a sequence of segments starting from
-at lease one :term:`root` segment, together with a parent-child adjacency relationship
+at least one :term:`root` segment, together with a parent-child adjacency relationship
 where a child segment is distal to its parent. Branches in the tree occur where a segment
 has more than one child. Furthermore, a segment can not have more than one parent.
 In this manner, neuron morphologies are modelled as a tree, where cables that
@@ -515,7 +515,7 @@ The simplest branching morphology is a cable that bifurcates into two branches,
 which we will call a *y-shaped cell*.
 In the example below, the first branch of the tree is a cable of length 10 μm with a
 a radius that tapers from 1 μm to 0.5 μm.
-The two child branches are attached to the end of the first branch, and taper from from 0.5 μ m
+The two child branches are attached to the end of the first branch, and taper from from 0.5 μm
 to 0.2 μm.
 
 Note that only the distal point is required to describe the child segments,
@@ -537,7 +537,7 @@ radius as the distal end of the parent.
 Example 4: Soma with branches
 """"""""""""""""""""""""""""""
 
-Now let's look at cell with a simple dendritic tree attached to a spherical soma.
+Now let's look at a cell with a simple dendritic tree attached to a spherical soma.
 The spherical soma of radius 3 μm is modelled with a cylinder with length and
 diameter equal to 6 μm, which has the same surface area as the sphere.
 
@@ -568,7 +568,7 @@ in the dendritic tree because the segments have parent child ordering and no for
     and no special treatment is given to the soma.
     There is no need to treat segments with different tags (e.g. tags that we might associate
     with soma, axon, basal dendrite and apical dendrite) when defining geometric primitives like
-    segments and branches, because they can later be referenced later using
+    segments and branches, because they can later be referenced using
     :ref:`region expressions <labels-expressions>`.
 
 Now we can attach another dendrite and an axon to the soma, to make a total of three cables
@@ -576,7 +576,7 @@ attached to the soma (two dendrites and an axon).
 The dendrites are attached to the distal end of the soma (segment 0), so they have the
 0 as their parent.
 The axon is attached to the proximal end of the soma, which is at the root of the tree,
-so it has :data:`mnpos` as its parent.
+so it has :py:data:`mnpos <arbor.mnpos>` as its parent.
 There are 7 branches generated from 10 segments, and soma segment is its own branch,
 because it has two children: the dendrites attached to its distal end.
 
diff --git a/doc/contrib/pr.rst b/doc/contrib/pr.rst
index 01d1d11e264c222bdb466bdb4b76a8ad723ebb85..a774b023ce8ec4aeb60c4183c8f1bb95480a1a51 100644
--- a/doc/contrib/pr.rst
+++ b/doc/contrib/pr.rst
@@ -58,7 +58,7 @@ Each pull request is reviewed according to these guidelines:
    positive review.
 -  GitHub Actions CI must produce a favourable result on your PR.
 -  An Arbor team member will (squash) merge the PR with the PR change
-   summery as commit message.
+   summary as commit message.
 -  Consider using Gitpod to review larger PRs, see under checks on the Github PR page.
 
 .. _contribpr-merge:
diff --git a/doc/fileformat/asc.rst b/doc/fileformat/asc.rst
index 70d648f1d9475e40259f3404729f63f1897f60e8..0fb79f3583071e08d6349d2c1b3c19c0e2065998 100644
--- a/doc/fileformat/asc.rst
+++ b/doc/fileformat/asc.rst
@@ -46,7 +46,7 @@ Arbor supports description methods 1 and 2 following the `neuromporpho policies
 Currently multiple contours in method 3 are not supported, and if you need support make
 the request with an `issue <https://github.com/arbor-sim/arbor/issues>`_.
 
-In each case, the soma is modeled as a cylinder with diameter equal to it's length, centred
+In each case, the soma is modeled as a cylinder with diameter equal to its length, centred
 at the centre of the soma, and oriented along the y axis.
 
 For a **spherical** soma, the centre and diameter are that of the sphere. For
diff --git a/doc/fileformat/neuroml.rst b/doc/fileformat/neuroml.rst
index 9c3347af6bb235ed73f169cc4c5cff7eac843f15..7ae99f6dbf3dca052e3dfa5861d0f77de1a6a344 100644
--- a/doc/fileformat/neuroml.rst
+++ b/doc/fileformat/neuroml.rst
@@ -5,10 +5,10 @@ NeuroML2
 
 Arbor offers limited support for models described in `NeuroML version 2 <https://neuroml.org/neuromlv2>`_.
 This is not built by default (see :ref:`NeuroML support <install-neuroml>` for instructions on how
-to build arbor with NeuroML).
+to build Arbor with NeuroML).
 
 Once support is enabled, Arbor is able to parse and check the validity of morphologies described in NeuroML files,
-and present the encoded data to the user.  This is more than a simple a `segment tree`.
+and present the encoded data to the user.  This is more than a simple `segment tree`.
 
 NeuroML can encode in the same file multiple top-level morphologies, as well as cells:
 
@@ -34,7 +34,7 @@ Example
    </cell>
    </neuroml>
 
-The above NeuroML description defines 2 top-level morphologies ``m1`` and ``m2`` (empty); a cell ``c1`` that uses
+The above NeuroML description defines two top-level morphologies ``m1`` and ``m2`` (empty); a cell ``c1`` that uses
 morphology ``m1``; and a cell ``c2`` that uses an internally defined (empty) morphology ``m3``.
 
 Arbor can query the cells and morphologies using their ids and return all the associated morphological data for each.
@@ -46,4 +46,4 @@ API
 ^^^
 
 * :ref:`Python <pyneuroml>`
-* :ref:`C++ <cppneuroml>`
\ No newline at end of file
+* :ref:`C++ <cppneuroml>`
diff --git a/doc/fileformat/swc.rst b/doc/fileformat/swc.rst
index b4d7048b4adff9c0383d872d69787f97d08c7854..953cc4e3a1f124f8a90bbc1e6e96270ba3e9bd63 100644
--- a/doc/fileformat/swc.rst
+++ b/doc/fileformat/swc.rst
@@ -14,7 +14,7 @@ an `x,y,z` location in space, a radius, a tag and a parent id. Arbor parses thes
 then generates a morphology according to one of three possible interpretations.
 
 The SWC file format specifications are not very detailed, which has lead different simulators to interpret
-SWC files in different ways, especially when it comes to the soma. Arbor has its own an interpretation that
+SWC files in different ways, especially when it comes to the soma. Arbor has its own interpretation that
 is powerful and simple to understand at the same time. However, we have also developed functions that will
 interpret SWC files similarly to how the NEURON simulator would, and how the Allen Institute would.
 
@@ -32,7 +32,7 @@ is interpreted as a fork point in the morphology, and acts as the proximal point
 
 Arbor interpretation
 """"""""""""""""""""
-In addition to the previously listed checks, the arbor interpretation explicitly disallows SWC files where the soma is
+In addition to the previously listed checks, the Arbor interpretation explicitly disallows SWC files where the soma is
 described by a single sample. It constructs the soma from 2 or more samples, forming 1 or more segments. A *segment* is
 always constructed between a sample and its parent. This means that there are no gaps in the resulting morphology.
 
@@ -74,7 +74,7 @@ and all samples are translated in space towards the origin.
 NEURON interpretation
 """""""""""""""""""""
 The NEURON interpretation was obtained by experimenting with the ``Import3d_SWC_read`` function. We came up with the
-following set of rules that govern NEURON's SWC behavior and enforced them in arbor's NEURON-complaint SWC
+following set of rules that govern NEURON's SWC behavior and enforce them in Arbor's NEURON-complaint SWC
 interpreter:
 
 * SWC files must contain a soma sample and it must to be the first sample.
@@ -95,4 +95,4 @@ API
 """
 
 * :ref:`Python <pyswc>`
-* :ref:`C++ <cppswc>`
\ No newline at end of file
+* :ref:`C++ <cppswc>`
diff --git a/doc/math/model/appendix.tex b/doc/math/model/appendix.tex
index 81a04377c2f6db62dc7f51e03705b21a6d657a9a..2b7e211e50355af3924c71a480ef8a1f61318fbb 100644
--- a/doc/math/model/appendix.tex
+++ b/doc/math/model/appendix.tex
@@ -1,7 +1,7 @@
 %-----------------------------------
-\subsection{The conic frustrum}
+\subsection{The conic frustum}
 %-----------------------------------
-The derivation of the surface area of conic frustrum.
+The derivation of the surface area of conic frustum.
 The edge length $l$ is defined
 \begin{equation}
     l = \sqrt{(x_r - x_l)^2 + (a_r - a_l)^2} = \sqrt{\Delta x^2 + \Delta a^2}.
@@ -13,7 +13,7 @@ The lateral area of the surface is found by integrating along surface of rotatio
         &= 2\pi \int_{0}^{l} {a_{\ell} + \frac{s}{l}\left( a_r - a_\ell \right)} \deriv{s} \nonumber \\
         &= 2\pi \left[ a_{\ell}s + \frac{s^2}{2l}\left( a_r - a_\ell \right) \right]_0^l \nonumber \\
         &= \pi l \left( a_{\ell} + a_r \right) \nonumber \\
-        &= \pi \left( a_{\ell} + a_r \right) \sqrt{\Delta x^2 + \Delta a^2}. \label{eq:frustrum_area}
+        &= \pi \left( a_{\ell} + a_r \right) \sqrt{\Delta x^2 + \Delta a^2}. \label{eq:frustum_area}
 \end{align}
 
 There are two degenerate cases of interest. The first is the \emph{cylinder}, for which the radii at each end are euqal, i.e. $a_\ell = a_r = a$. In this case the lateral area of the surface is
diff --git a/doc/math/model/formulation.tex b/doc/math/model/formulation.tex
index 8db5184e38e84b3904ce9d86b03eb3ec6a69580d..ca58f00b2d6ca98e7049f8c466e747787470bab5 100644
--- a/doc/math/model/formulation.tex
+++ b/doc/math/model/formulation.tex
@@ -93,7 +93,7 @@ The current, which is the conserved quantity in our conservation law, over the s
 This is derived from a thin film approximation to the cell membrane, whereby the membrane is treated as an infinitesimally thin interface between the intra and extra cellular regions.
 
 Note that some information is lost when going from a three-dimensional description of a neuron to a system of branching one-dimensional cable segments.
-If the cell is represented by cylinders or frustrums\footnote{a frustrum is a truncated cone, where the truncation plane is parallel to the base of the cone.}, the three-dimensional values for volume and surface area at branch points can't be retrieved from the one-dimensional description.
+If the cell is represented by cylinders or frustums\footnote{a frustum is a truncated cone, where the truncation plane is parallel to the base of the cone.}, the three-dimensional values for volume and surface area at branch points can't be retrieved from the one-dimensional description.
 
 \begin{figure}
     \begin{center}
@@ -201,14 +201,14 @@ The current terms are an average per unit area, therefore the total flux
 \end{equation}
 where $\sigma_i$ is the surface area the of the exterior of the cable segment, i.e. the surface corresponding to the cell membrane.
 
-Each cable segment is a conical frustrum, as illustrated in \fig{fig:segment}.
-The lateral surface area of a frustrum with height $\Delta x_i$ and radii of  is
+Each cable segment is a conical frustum, as illustrated in \fig{fig:segment}.
+The lateral surface area of a frustum with height $\Delta x_i$ and radii of  is
 The area of the external surface $\Gamma_{i}$ is
 \begin{equation}
     \sigma_i = \pi (a_{i,\ell} + a_{i,r}) \sqrt{\Delta x_i^2 + (a_{i,\ell} - a_{i,r})^2},
     \label{eq:cv_volume}
 \end{equation}
-where $a_{i,\ell}$ and $a_{i,r}$ are the radii of at the left and right end of the segment respectively (see~\eq{eq:frustrum_area} for derivation of this formula).
+where $a_{i,\ell}$ and $a_{i,r}$ are the radii of at the left and right end of the segment respectively (see~\eq{eq:frustum_area} for derivation of this formula).
 %-------------------------------------------------------------------------------
 \subsubsection{Putting it all together}
 %-------------------------------------------------------------------------------
@@ -228,7 +228,7 @@ is the area of the surface between two adjacent segments $i$ and $j$, and
     \sigma_{i}   = \pi(a_{i,\ell} + a_{i,r}) \sqrt{\Delta x_i^2 + (a_{i,\ell} - a_{i,r})^2},
     \label{eq:sigma_i}
 \end{equation}
-is the lateral area of the conical frustrum describing segment $i$.
+is the lateral area of the conical frustum describing segment $i$.
 
 %-------------------------------------------------------------------------------
 \subsubsection{Time Stepping}
diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst
index d5cc95d8ba9ad6f805c8bd9dcbc5c5a24976f64b..ce94e4dd038de1392361e83238b2771ec0657ab8 100644
--- a/doc/tutorial/index.rst
+++ b/doc/tutorial/index.rst
@@ -11,7 +11,7 @@ Tutorials
     installed independently from Arbor.
 
     In an interactive Python interpreter, you can use ``help()`` on any class or function to get its
-    documentation. (Try, ``help(arbor.simulation``, for example).
+    documentation. (Try, ``help(arbor.simulation)``, for example).
 
 .. Todo::
     Add more in-depth tutorial-like pages building up examples here.
diff --git a/doc/tutorial/network_ring.rst b/doc/tutorial/network_ring.rst
index d0db20cfe192b959ec64eef73dba2fdd8b98b51f..8401e839647817cd17ed0a81ba36acca98d2e3d6 100644
--- a/doc/tutorial/network_ring.rst
+++ b/doc/tutorial/network_ring.rst
@@ -65,7 +65,7 @@ These locations will form the endpoints of the connections between the cells.
 After we've created a basic :py:class:`arbor.decor`, step **(3)** places a synapse with an exponential decay (``'expsyn'``) is on the ``'synapse_site'``.
 Note that mechanisms can be initialized with their name; ``'expsyn'`` is short for ``arbor.mechanism('expsyn')``.
 
-Step **(4)** places a spike detector at the ``'root'``. :py:class:`spike_detectors <spike_detector>` will send spikes into an
+Step **(4)** places a spike detector at the ``'root'``. :py:class:`spike_detectors <arbor.spike_detector>` will send spikes into an
 :class:`arbor.connection`, whereas the :ref:`expsyn mechanism <mechanisms_builtins>` can receive spikes from an
 :class:`arbor.connection`.
 
@@ -195,8 +195,8 @@ In addition to having the timestamps of spikes, we want to extract the voltage a
 Step **(14)** sets the probes (step **10**) to measure at a certain schedule. This is sometimes described as
 attaching a :term:`sampler` to a :term:`probe`. :py:func:`arbor.simulation.sample` expects a :term:`probe id` and the
 desired schedule (here: a recording frequency of 10 kHz). Note that the probe id is a separate index from those of
-:term:`connection` endpoints; probe ids correspond to the index of the list produced by :py:func:`arbor.recipe.
-probes` on cell ``gid``.
+:term:`connection` endpoints; probe ids correspond to the index of the list produced by
+:py:func:`arbor.recipe.probes` on cell ``gid``.
 
 :py:func:`arbor.simulation.sample` returns a handle to the :term:`samples <sample>` that will be recorded. We store
 these handles for later use.
diff --git a/doc/tutorial/single_cell_detailed.rst b/doc/tutorial/single_cell_detailed.rst
index 4655cd1b6ee4a7c846683f08ab65ebd671e15257..ba0b0f8c4ed62e6e79de037db8a51568dae6261b 100644
--- a/doc/tutorial/single_cell_detailed.rst
+++ b/doc/tutorial/single_cell_detailed.rst
@@ -137,7 +137,7 @@ The label dictionary
 
 Next, we can define **region** and **location** expressions and give them labels.
 The regions and locations are defined using an Arbor-specific DSL, and the labels
-can be stored in a :class:`arbor.lable_dict`.
+can be stored in a :class:`arbor.label_dict`.
 
 .. Note::
 
@@ -157,7 +157,7 @@ defined as follows:
 
 .. code-block:: python
 
-    #Create a label dictionary
+    # Create a label dictionary
 
     labels = arbor.label_dict()
 
@@ -291,7 +291,7 @@ by the density mechanisms that we will be adding shortly.
 For both ions we set the default initial concentration and external concentration measures in mM;
 and we set the default initial reversal potential in mV. For the *na* ion, we additionally indicate
 the the progression on the reversal potential during the simulation will be dictated by the
-`nernst equation <https://en.wikipedia.org/wiki/Nernst_equation>`_.
+`Nernst equation <https://en.wikipedia.org/wiki/Nernst_equation>`_.
 
 It happens, however, that we want the temperature of the "custom" region defined in the label
 dictionary earlier to be colder, and the initial voltage of the "soma" region to be higher.
@@ -360,7 +360,7 @@ to be a single CV, and the rest of the morphology to be comprised of CVs with a
 The model
 *********
 
-We begin by constructing a :class:`arbor.single_cell_model` of the cell we just created.
+We begin by constructing an :class:`arbor.single_cell_model` of the cell we just created.
 
 .. code-block:: python
 
@@ -502,4 +502,4 @@ corresponding to each of the current clamps placed on the cell.
 
 The full code
 *************
-You can find the full code of the example at ``python/examples/single_cell_detailed.py``.
\ No newline at end of file
+You can find the full code of the example at ``python/examples/single_cell_detailed.py``.
diff --git a/doc/tutorial/single_cell_detailed_recipe.rst b/doc/tutorial/single_cell_detailed_recipe.rst
index 8f5b7791755a5fe914a3967d39bf26a41f7df975..f12580b00fabbbe1836a4241b606b1e35d887259 100644
--- a/doc/tutorial/single_cell_detailed_recipe.rst
+++ b/doc/tutorial/single_cell_detailed_recipe.rst
@@ -194,7 +194,7 @@ Let's go through the recipe point by point.
 Step **(1)** creates a ``single_recipe`` class that inherits from :class:`arbor.recipe`. The base recipe
 implements all the methods defined above with default values except :meth:`arbor.recipe.num_cells`,
 :meth:`arbor.recipe.cell_kind` and :meth:`arbor.recipe.cell_description` which always have to be implemented
-by the user. The :meth:`arbor.recipe.gloabl_properties` also needs to be implemented for
+by the user. The :meth:`arbor.recipe.global_properties` also needs to be implemented for
 :class:`arbor.cell_kind.cable` cells. The inherited recipe can implement any number of additional methods and
 have any number of instance or class variables.
 
@@ -218,7 +218,7 @@ what we did in the :ref:`previous example <tutorialsinglecellswc-gprop>`. One la
    The mechanism catalogue needs to live in the recipe as an instance variable. Its lifetime needs to extend
    to the entire duration of the simulation.
 
-Step **(3)** overrides the :meth:`arbor.recipe.num_cells` method. It takes 0 arguments. We simply return 1,
+Step **(3)** overrides the :meth:`arbor.recipe.num_cells` method. It takes no arguments. We simply return 1,
 as we are only simulating one cell in this example.
 
 Step **(4)** overrides the :meth:`arbor.recipe.num_sources` method. It takes one argument: ``gid``.
@@ -284,7 +284,7 @@ previous section:
 The execution context
 *********************
 
-An :ref:`execution context <modelcontext>`_ describes the hardware resources on which the simulation will run.
+An :ref:`execution context <modelcontext>` describes the hardware resources on which the simulation will run.
 It contains the thread pool used to parallelise work on the local CPU, and optionally describes GPU resources
 and the MPI communicator for distributed simulations. In the previous
 examples, the :class:`arbor.single_cell_model` object created the execution context :class:`arbor.context`
@@ -354,7 +354,7 @@ Next, we instructed the simulation to sample ``probe_id`` at a frequency of 50 k
 The execution
 *************
 
-We can now run the simulation we just instantiated for a duration of 100ms with a time step of 0.025 ms.
+We can now run the simulation we just instantiated for a duration of 100 ms with a time step of 0.025 ms.
 
 .. code-block:: python
 
@@ -416,4 +416,4 @@ The following plot is generated. Identical to the plot of the previous example.
 The full code
 *************
 
-You can find the full code of the example at ``python/examples/single_cell_detailed_recipe.py``.
\ No newline at end of file
+You can find the full code of the example at ``python/examples/single_cell_detailed_recipe.py``.
diff --git a/doc/tutorial/single_cell_recipe.rst b/doc/tutorial/single_cell_recipe.rst
index 54ab8ae5914f506e40a319660f59b2961fe0a572..43a152f3831eec468ba41f24db139e4121bde125 100644
--- a/doc/tutorial/single_cell_recipe.rst
+++ b/doc/tutorial/single_cell_recipe.rst
@@ -114,8 +114,8 @@ and descriptions.
 
 Step **(4.5)** returns the cell description passed in on class initialisation. If we
 were modelling multiple cells of different kinds, we would need to make sure that the
-cell returned by :meth:arbor.recipe.cell_description has the same cell kind as
-returned by :meth:arbor.recipe.cell_kind for every :gen:gid.
+cell returned by :meth:`arbor.recipe.cell_description` has the same cell kind as
+returned by :meth:`arbor.recipe.cell_kind` for every :gen:`gid`.
 
 Step **(4.6)** returns the probes passed in at class initialisation.
 
@@ -131,10 +131,10 @@ The context and domain decomposition
 :class:`arbor.single_cell_model` does not only take care of the recipe, it also takes
 care of defining how the simulation will be run. When you create and use your own
 recipe, you'll need to do this manually, in the form of defining a execution context
-and a domain decomposition. Fortunately, the default constructors of :class:`arbor.
-context` and :class:`arbor.partition_load_balance` are sufficient for this model, and
-is what :class:`arbor.single_cell_model` does under the hood! We'll leave the details
-of this subject for another tutorial.
+and a domain decomposition. Fortunately, the default constructors of
+:class:`arbor.context` and :class:`arbor.partition_load_balance` are sufficient for
+this model, and is what :class:`arbor.single_cell_model` does under the hood! We'll
+leave the details of this subject for another tutorial.
 
 .. code-block:: python