diff --git a/doc/source/images/faq.py.diff b/doc/source/images/faq.py.diff
index 4f4efd335495e3f82a617678e878a6ef8e231659..4df4fd94bffa976cf028011428df2d4d1c19468d 100644
--- a/doc/source/images/faq.py.diff
+++ b/doc/source/images/faq.py.diff
@@ -1,14 +1,14 @@
 --- original
 +++ modified
-@@ -1,6 +1,7 @@
- # Frequently Asked Questions
- # ==========================
+@@ -3,6 +3,7 @@
+ # This script is a disorganized collection of code snippets.  As a whole, it is
+ # not meant as an example of good programming practice.
  
 +import _defs
  import kwant
  import numpy as np
  import tinyarray
-@@ -9,6 +10,12 @@
+@@ -11,6 +12,12 @@
  matplotlib.rcParams['figure.figsize'] = (3.5, 3.5)
  
  
@@ -18,34 +18,34 @@
 +                    dpi=_defs.dpi, bbox_inches='tight')
 +
 +
- ######## What is a Site? ##############
+ #### What is a Site?
  
  a = 1
-@@ -19,6 +26,7 @@
+@@ -21,6 +28,7 @@
  syst[lat(1, 1)] = 4
  
  kwant.plot(syst)
 +save_figure("faq_site")
  
  
- 
-@@ -40,6 +48,7 @@
- syst[lat2(0, 0)] = 4  # syst[subB(0, 0)] = 4
+ #### What is a hopping?
+@@ -34,6 +42,7 @@
+ syst[(lat(1, 0), lat(1, 1))] = 1j
  
  kwant.plot(syst)
-+save_figure("faq_lattice")
++save_figure("faq_hopping")
  
  
- ########## What is a hopping? #######################
-@@ -53,6 +62,7 @@
- syst[(lat(1, 0), lat(1, 1))] = -1
+ #### What is a lattice?
+@@ -50,6 +59,7 @@
+ syst[lat_b(0, 0)] = 4
  
  kwant.plot(syst)
-+save_figure("faq_hopping")
- 
- ########### How to make a hole in a system? ###################"
++save_figure("faq_lattice")
  
-@@ -69,6 +79,7 @@
+ # One polyatomic lattice containing two sublattices
+ lat = kwant.lattice.Polyatomic([(1, 0), (0, 1)], [(0, 0), (0.5, 0.5)])
+@@ -70,6 +80,7 @@
  
  syst[(lat(i, j, k) for i in range(L) for j in range(W) for k in range(H))] = 4
  kwant.plot(syst)
@@ -53,24 +53,24 @@
  
  # Delete sites to create a hole
  
-@@ -80,6 +91,7 @@
+@@ -81,6 +92,7 @@
      del syst[site]
  
  kwant.plot(syst)
 +save_figure("faq_hole2")
  
  
- ################ How can we get access to the sites of our system? ####################
-@@ -133,7 +145,7 @@
+ #### How can we get access to the sites of our system?
+@@ -127,7 +139,7 @@
  
- ## Plotting the system
+ ## Plot the system.
  plot_system(syst)
 -
 +save_figure("faq_colors")
  
+ #### How to create all hoppings in a given direction using Hoppingkind?
  
- ############### How to create all hoppings in a given direction using Hoppingkind? ################
-@@ -149,6 +161,7 @@
+@@ -141,6 +153,7 @@
  
  syst[kwant.builder.HoppingKind((1, 0), lat)] = -1
  kwant.plot(syst)
@@ -78,7 +78,7 @@
  
  # Polyatomic lattice
  
-@@ -181,12 +194,14 @@
+@@ -171,12 +184,14 @@
  # equivalent to syst[kwant.builder.HoppingKind((0, 1), b)] = -1
  syst[kwant.builder.HoppingKind((0, 1), b, b)] = -1
  plot_system(syst)
@@ -92,8 +92,8 @@
 +save_figure("faq_direction3")
  
  
- ########## How to create the hoppings between adjacent sites? ################
-@@ -201,11 +216,13 @@
+ #### How to create the hoppings between adjacent sites?
+@@ -190,11 +205,13 @@
  
  syst[lat.neighbors()] = -1  # Equivalent to lat.neighbors(1)
  kwant.plot(syst)
@@ -107,7 +107,7 @@
  
  # Polyatomic lattice
  
-@@ -224,9 +241,11 @@
+@@ -213,9 +230,11 @@
  
  syst[lat.neighbors()] = -1
  plot_system(syst)
@@ -119,35 +119,35 @@
  del syst[a.neighbors()]  # Delete the hoppings previously created
  
  
-@@ -264,6 +283,7 @@
+@@ -253,6 +272,7 @@
  syst[(subB(i, j) for i in range(L) for j in range(W))] = 4
  syst[lat.neighbors()] = -1
  plot_system(syst)
-+save_figure("faq_different_latticea1")
++save_figure("faq_different_lattice1")
  
  # Create a lead
  lat_lead = kwant.lattice.square()
-@@ -273,6 +293,7 @@
+@@ -262,6 +282,7 @@
  lead1[(lat_lead(i, 0) for i in range(2, 7))] = 4
  lead1[lat_lead.neighbors()] = -1
  plot_system(lead1)
-+save_figure("faq_different_latticea2")
++save_figure("faq_different_lattice2")
  
  syst[(lat_lead(i, 5) for i in range(2, 7))] = 4
  syst[lat_lead.neighbors()] = -1
-@@ -280,9 +301,11 @@
+@@ -269,9 +290,11 @@
  # Manually attach sites from graphene to square lattice
  syst[((lat_lead(i+2, 5), subB(i, 4)) for i in range(5))] = -1
  plot_system(syst)
-+save_figure("faq_different_latticea3")
++save_figure("faq_different_lattice3")
  
  syst.attach_lead(lead1)
  plot_system(syst)
-+save_figure("faq_different_latticea4")
++save_figure("faq_different_lattice4")
  
  
- ############# How to cut a finite system out of a system with translationnal symmetries? ###########
-@@ -302,6 +325,7 @@
+ #### How to cut a finite system out of a system with translationnal symmetries?
+@@ -291,6 +314,7 @@
  cuboid = kwant.Builder()
  cuboid.fill(model, cuboid_shape, (0, 0, 0));
  kwant.plot(cuboid);
@@ -155,31 +155,31 @@
  
  # Build electrode (black).
  def electrode_shape(site):
-@@ -316,6 +340,7 @@
+@@ -305,6 +329,7 @@
  
  cuboid.attach_lead(electrode)
  kwant.plot(cuboid);
 +save_figure("faq_fill3")
  
  
- ###### How does Kwant order the propagating modes of a lead? ######
-@@ -348,6 +373,7 @@
+ #### How does Kwant order the propagating modes of a lead?
+@@ -337,6 +362,7 @@
      plt.show()
  
  plot_and_label_modes(flead, E)
 +save_figure('faq_pm1')
- plt.clf()
  
  # More involved example
-@@ -363,6 +389,7 @@
+ 
+@@ -351,6 +377,7 @@
  flead2 = lead2.finalized()
  
  plot_and_label_modes(flead2, 1)
 +save_figure('faq_pm2')
- plt.clf()
  
  
-@@ -395,7 +422,8 @@
+ #### How does Kwant order components of an individual wavefunction?
+@@ -381,7 +408,8 @@
  
  idx = syst.id_by_site[lat(0, 0)]  # look up index of site
  
@@ -189,7 +189,7 @@
  
  lat = kwant.lattice.square(norbs=2)
  syst = make_system(lat)
-@@ -408,4 +436,5 @@
+@@ -394,4 +422,5 @@
  # to degrees of freedom on the same site.
  wf = wf.reshape(-1, 2)
  
diff --git a/doc/source/tutorial/faq.py b/doc/source/tutorial/faq.py
index 3c981feada551b34f9a5ccf3a81576baf6001a51..3a00860b375fbdc558e141bfeae803c4fd19ccc7 100644
--- a/doc/source/tutorial/faq.py
+++ b/doc/source/tutorial/faq.py
@@ -1,5 +1,7 @@
-# Frequently Asked Questions
-# ==========================
+# Frequently asked questions
+#
+# This script is a disorganized collection of code snippets.  As a whole, it is
+# not meant as an example of good programming practice.
 
 import kwant
 import numpy as np
@@ -9,7 +11,7 @@ from matplotlib import pyplot as plt
 matplotlib.rcParams['figure.figsize'] = (3.5, 3.5)
 
 
-######## What is a Site? ##############
+#### What is a Site?
 
 #HIDDEN_BEGIN_site
 a = 1
@@ -23,44 +25,45 @@ kwant.plot(syst)
 #HIDDEN_END_site
 
 
+#### What is a hopping?
 
-################# What is a family? a tag? a lattice? ##################
-
-#HIDDEN_BEGIN_lattice
-# 2 Monatomic lattices
-primitive_vectors = [(1, 0), (0, 1)]
-lat1 = kwant.lattice.Monatomic(primitive_vectors, offset=(0, 0))  # equivalent to kwant.lattice.square()
-lat2 = kwant.lattice.Monatomic(primitive_vectors, offset=(0.5, 0.5))
-
-# 1 Polyatomic lattice containing two sublattices
-lat3 = kwant.lattice.Polyatomic([(1, 0) , (0, 1)], [(0, 0) , (0.5, 0.5)])
-subA, subB = lat3.sublattices
-
-
+a = 1
+lat = kwant.lattice.square(a)
 syst = kwant.Builder()
 
-syst[lat1(0, 0)] = 4  # syst[subA(0, 0)] = 4
-syst[lat2(0, 0)] = 4  # syst[subB(0, 0)] = 4
+syst[lat(1, 0)] = 4
+syst[lat(1, 1)] = 4
+#HIDDEN_BEGIN_hopping
+syst[(lat(1, 0), lat(1, 1))] = 1j
+#HIDDEN_END_hopping
 
 kwant.plot(syst)
-#HIDDEN_END_lattice
 
 
-########## What is a hopping? #######################
+#### What is a lattice?
+
+#HIDDEN_BEGIN_lattice_monatomic
+# Two monatomic lattices
+primitive_vectors = [(1, 0), (0, 1)]
+lat_a = kwant.lattice.Monatomic(primitive_vectors, offset=(0, 0))
+lat_b = kwant.lattice.Monatomic(primitive_vectors, offset=(0.5, 0.5))
+# lat1 is equivalent to kwant.lattice.square()
 
-a = 1
-lat = kwant.lattice.square(a)
 syst = kwant.Builder()
 
-syst[lat(1, 0)] = 4
-syst[lat(1, 1)] = 4
-#HIDDEN_BEGIN_hopping
-syst[(lat(1, 0), lat(1, 1))] = -1
-#HIDDEN_END_hopping
+syst[lat_a(0, 0)] = 4
+syst[lat_b(0, 0)] = 4
 
 kwant.plot(syst)
+#HIDDEN_END_lattice_monatomic
+
+#HIDDEN_BEGIN_lattice_polyatomic
+# One polyatomic lattice containing two sublattices
+lat = kwant.lattice.Polyatomic([(1, 0), (0, 1)], [(0, 0), (0.5, 0.5)])
+sub_a, sub_b = lat.sublattices
+#HIDDEN_END_lattice_polyatomic
 
-########### How to make a hole in a system? ###################"
+#### How to make a hole in a system?
 
 #HIDDEN_BEGIN_hole
 # Define the lattice and the (empty) system
@@ -90,7 +93,7 @@ kwant.plot(syst)
 #HIDDEN_END_hole
 
 
-################ How can we get access to the sites of our system? ####################
+#### How can we get access to the sites of our system?
 
 builder = kwant.Builder()
 lat = kwant.lattice.square()
@@ -99,7 +102,6 @@ builder[(lat(i, j) for i in range(3) for j in range(3))] = 4
 # Before finalizing the system
 
 sites = list(builder.sites())  # sites() doe *not* return a list
-
 #HIDDEN_END_sites1
 #HIDDEN_BEGIN_sites2
 # After finalizing the system
@@ -111,7 +113,7 @@ i = syst.id_by_site[lat(0, 2)]  # we want the id of the site lat(0, 2)
 #HIDDEN_END_sites3
 
 
-################ How to plot a polyatomic lattice with different colors? ##############"
+#### How to plot a polyatomic lattice with different colors?
 
 #HIDDEN_BEGIN_colors1
 lat = kwant.lattice.kagome()
@@ -122,44 +124,36 @@ a, b, c = lat.sublattices  # The kagome lattice has 3 sublattices
 
 #HIDDEN_BEGIN_colors2
 # Plot sites from different families in different colors
+def family_color(site):
+    if site.family == a:
+        return 'red'
+    if site.family == b:
+        return 'green'
+    else:
+        return 'blue'
 
 def plot_system(syst):
+    kwant.plot(syst, site_lw=0.1, site_color=family_color)
 
-    def family_color(site):
-        if site.family == a:
-            return 'red'
-        if site.family == b:
-            return 'green'
-        else:
-            return 'blue'
-
-    def hopping_lw(site1, site2):
-        return 0.1 if site1.family == site2.family else 0.1
-
-    kwant.plot(syst, site_lw=0.1, site_color=family_color, hop_lw=hopping_lw)
-
-
-## Adding sites and hoppings
+## Add sites and hoppings.
 for i in range(4):
     for j in range (4):
-        syst[a(i, j)] = 4  # red
-        syst[b(i, j)] = 4  # green
-        syst[c(i, j)] = 4  # blue
+        syst[a(i, j)] = 4
+        syst[b(i, j)] = 4
+        syst[c(i, j)] = 4
 
 syst[lat.neighbors()] = -1
 
-## Plotting the system
+## Plot the system.
 plot_system(syst)
-
 #HIDDEN_END_colors2
 
 
-############### How to create all hoppings in a given direction using Hoppingkind? ################
+#### How to create all hoppings in a given direction using Hoppingkind?
 
 # Monatomic lattice
 
 #HIDDEN_BEGIN_direction1
-
 # Create hopping between neighbors with HoppingKind
 a = 1
 syst = kwant.Builder()
@@ -177,25 +171,23 @@ syst = kwant.Builder()
 
 a, b, c = lat.sublattices  # The kagome lattice has 3 sublattices
 
+def family_color(site):
+    if site.family == a:
+        return 'red'
+    if site.family == b:
+        return 'green'
+    else:
+        return 'blue'
 
 def plot_system(syst):
-
-    def family_color(site):
-        if site.family == a:
-            return 'blue'
-        if site.family == b:
-            return 'red'
-        else:
-            return 'green'
-
     kwant.plot(syst, site_size=0.15, site_lw=0.05, site_color=family_color)
 
 
 for i in range(4):
     for j in range (4):
-        syst[a(i, j)] = 4  # red
-        syst[b(i, j)] = 4  # green
-        syst[c(i, j)] = 4  # blue
+        syst[a(i, j)] = 4
+        syst[b(i, j)] = 4
+        syst[c(i, j)] = 4
 
 
 #HIDDEN_BEGIN_direction2
@@ -213,12 +205,11 @@ syst[kwant.builder.HoppingKind((0, 0), c, b)] = -1
 plot_system(syst)
 
 
-########## How to create the hoppings between adjacent sites? ################
+#### How to create the hoppings between adjacent sites?
 
 # Monatomic lattice
 
 #HIDDEN_BEGIN_adjacent1
-
 # Create hoppings with lat.neighbors()
 syst = kwant.Builder()
 lat = kwant.lattice.square()
@@ -266,7 +257,7 @@ plot_system(syst)
 del syst[lat.neighbors(2)]
 
 
-##### How to create a lead with a lattice different from the scattering region? ##########
+#### How to create a lead with a lattice different from the scattering region?
 
 # Plot sites from different families in different colors
 
@@ -324,7 +315,7 @@ syst.attach_lead(lead1)
 plot_system(syst)
 
 
-############# How to cut a finite system out of a system with translationnal symmetries? ###########
+#### How to cut a finite system out of a system with translationnal symmetries?
 
 #HIDDEN_BEGIN_fill1
 # Create 3d model.
@@ -363,7 +354,7 @@ cuboid.attach_lead(electrode)
 kwant.plot(cuboid);
 
 
-###### How does Kwant order the propagating modes of a lead? ######
+#### How does Kwant order the propagating modes of a lead?
 
 #HIDDEN_BEGIN_pm
 lat = kwant.lattice.square()
@@ -395,7 +386,6 @@ def plot_and_label_modes(lead, E):
     plt.show()
 
 plot_and_label_modes(flead, E)
-plt.clf()
 
 # More involved example
 
@@ -410,11 +400,9 @@ lead2[lat.neighbors()] = -1 * sz
 flead2 = lead2.finalized()
 
 plot_and_label_modes(flead2, 1)
-plt.clf()
-
 
-###### How does Kwant order components of an individual wavefunction? ######
 
+#### How does Kwant order components of an individual wavefunction?
 def circle(R):
     return lambda r: np.linalg.norm(r) < R
 
diff --git a/doc/source/tutorial/faq.rst b/doc/source/tutorial/faq.rst
index 13218cf243f3d0b5e374cf9c3f5cab5c62d215c0..eccec8a8993eead562c9c368e85d2a230a071ab8 100644
--- a/doc/source/tutorial/faq.rst
+++ b/doc/source/tutorial/faq.rst
@@ -1,24 +1,39 @@
+Frequently asked questions
 --------------------------
-Frequently Asked Questions
---------------------------
-It is important to read the tutorials before looking at the questions. This FAQ
-is aimed to add complementary explainations that are not in the tutorials. The `Kwant paper <https://downloads.kwant-project.org/doc/kwant-paper.pdf>`_ also digs deeper into Kwant's structure.
+This FAQ complements the regular Kwant tutorials and thus does not cover
+questions that are discussed there.  The `Kwant paper
+<https://downloads.kwant-project.org/doc/kwant-paper.pdf>`_ also digs deeper
+into Kwant's structure.
 
 
 What is a system, and what is a builder?
 ========================================
-A Kwant system represents a tight-binding model. It contains a graph of edges
-and vertices that are assigned values, and which is used to construct
-the Hamiltonian for the model being simulated.
-
-In Kwant the specification of the tight-binding model is separated from the use
-of the model in numerical calculations. The `~kwant.builder.Builder` is used
-when specifying/constructing the model, then the
-`~kwant.builder.Builder.finalize` method is called, which produces a so-called
-low-level `~kwant.system.System` that can be used by Kwant's solvers.
-
-In the documentation and in mailing list discussions, the term general term
-"system" can be used to refer either to a ``Builder`` or to a low-level
+A Kwant system represents a particular tight-binding model. It contains a graph
+whose edges and vertices are assigned values, and that corresponds to the
+Hamiltonian matrix of the model being simulated.
+
+In Kwant the creation of the system is separated from its use in numerical
+calculations. First an instance of the `~kwant.builder.Builder` class is used
+to construct the model, then the `~kwant.builder.Builder.finalize` method is
+called, which produces a so-called low-level `~kwant.system.System` that can be
+used by Kwant's solvers.
+
+The interface of builders mimics Python mappings (e.g. dictionaries).  The
+familiar square-bracket syntax allows to set, get and delete items that
+correspond to elements of the system graph, e.g. ``syst[key] = value``.  An
+item consists of a key and an associated value.  Keys are `sites <What is a
+site?_>`_ and `hoppings <What is a hopping?_>`_.  Values can be numbers, arrays
+of numbers, or functions that return numbers or arrays.
+
+Finalizing a builder returns a copy of the system with the graph *structure*
+frozen.  (This can be equivalently seen as freezing the system geometry or the
+sparsity structure of the Hamiltonian.)  The associated *values* are taken over
+verbatim.  Note that finalizing does not freeze the Hamiltonian matrix: only
+its structure is fixed, values that are functions may depend on an arbitrary
+number of parameters.
+
+In the documentation and in mailing list discussions, the general term
+"system" can refer either to a ``Builder`` or to a low-level
 ``System``, and the context will determine which specific class is being
 referred to. The terms "builder" and "low-level system" (or "finalized system")
 refer respectively to ``Builder`` and ``System``.
@@ -27,9 +42,9 @@ refer respectively to ``Builder`` and ``System``.
 What is a site?
 ===============
 Kwant is a tool for working with tight-binding models, which can be viewed as a
-graph composed of edges and vertices.  Site objects are Kwant’s abstraction for
-the vertices.  Sites have two attributes: a **family** and a **tag** .  The
-combination of family and tag uniquely define a site.
+graph composed of edges and vertices.  Sites are Kwant’s labels for the
+vertices.  Sites have two attributes: a *family* and a *tag*.  The
+combination of family and tag uniquely defines a site.
 
 For example let us create an empty tight binding system and add two sites:
 
@@ -39,14 +54,57 @@ For example let us create an empty tight binding system and add two sites:
 
 .. image:: ../images/faq_site.*
 
-In the above snippet we added 2 sites: ``lat(1 ,0)`` and ``lat(0 , 1)``. Both
+In the above snippet we added 2 sites: ``lat(1, 0)`` and ``lat(0, 1)``. Both
 of these sites belong to the same family, ``lat``, but have different tags:
 ``(1, 0)`` and ``(0, 1)`` respectively.
 
+Both sites were given the value 4 which means that the above system corresponds
+to the Hamiltonian matrix
+
+.. math::
+    H = \left(
+    \begin{array}{cc}
+    4 & 0 \\
+    0 & 4
+    \end{array}
+    \right).
+
+
+What is a hopping?
+==================
+A hopping is simply a tuple of two of sites, which defines an edge of the graph
+that makes up a tight-binding model.  Other sequences of sites that are not
+tuples, for example lists, are not treated as hoppings.
+
+Starting from the example code from `What is a site?`_, we can add a hopping
+to our system in the following way:
+
+.. literalinclude:: faq.py
+    :start-after: #HIDDEN_BEGIN_hopping
+    :end-before: #HIDDEN_END_hopping
+
+.. image:: ../images/faq_hopping.*
+
+Visually, a hopping is represented as a line that joins two sites.
+
+The Hamiltonian matrix is now
+
+.. math::
+    H = \left(
+    \begin{array}{cc}
+    4 & i \\
+    -i & 4
+    \end{array}
+    \right).
+
+Note how adding ``(site_a, site_b)`` to a system and assigning it a value
+``v``, implicitly adds the hopping ``(site_b, site_a)`` with the Hermitian
+conjugate of ``v`` as value.
+
 
 What is a site family, and what is a tag?
 =========================================
-a site family "groups" related sites together, and a tag serves as a unique
+A site family groups related sites together, and a tag serves as a unique
 identifier for a site within a given family.
 
 In the previous example we saw a family that was suggestively called ``lat``,
@@ -63,48 +121,53 @@ are tagged by letters of the alphabet.
 
 What is a lattice?
 ==================
-Kwant allows users to define and use Bravais lattices for dealing with
-collections of regularly placed sites. They know about things like which sites
-on the lattice are neighbors, and how to fill a region of realspace with sites.
-``Monatomic`` lattices have a single site in their basis, while ``Polyatomic``
-have more than one site in their basis.
-
-``Monatomic`` lattices in Kwant *are also site families*, with sites that are
-tagged with tuples of integers: the site's coordinates in the basis of
-primitive vectors of the lattice. ``Polyatomic`` lattices, however, are *not*
-site families, as lattice coordinates are not enough information to uniquely
-identify a site if there is more than one site in the basis. ``Polyatomic``
+Kwant allows to define and use Bravais lattices for dealing with collections of
+regularly placed sites. They know about things like what sites are
+neighbors, or what sites belong to a given region of real space.
+`~kwant.lattice.Monatomic` lattices have a single site in their basis, while
+`~kwant.lattice.Polyatomic` lattices have more than one site in their basis.
+
+Monatomic lattices in Kwant *are also site families*, with sites that are
+tagged by tuples of integers: the site's coordinates in the basis of
+primitive vectors of the lattice. Polyatomic lattices, however, are *not*
+site families, since lattice coordinates are not enough information to uniquely
+identify a site if there is more than one site in the basis. Polyatomic
 lattices do, however, have an attribute ``sublattices`` that is a list of
-``Monatomic`` lattices that together make up the whole ``Polyatomic`` lattice.
+monatomic lattices that together make up the whole polyatomic lattice.
 
-For example:
+Let's create two monatomic lattices (``lat_a`` and ``lat_b``).  ``(1, 0)``
+and ``(0, 1)`` will be the primitive vectors and ``(0, 0)`` and ``(0.5, 0.5)``
+the origins of the two lattices:
 
 .. literalinclude:: faq.py
-    :start-after: #HIDDEN_BEGIN_lattice
-    :end-before: #HIDDEN_END_lattice
+    :start-after: #HIDDEN_BEGIN_lattice_monatomic
+    :end-before: #HIDDEN_END_lattice_monatomic
 
 .. image:: ../images/faq_lattice.*
 
-Above, we created 2 ``Monatomic`` lattices (``lat1`` and ``lat2``).  ``(1, 0)``
-and ``(0, 1)`` are the primitive vectors and ``(0, 0)`` and ``(0.5, 0.5)`` are
-the origins of the two lattices. Next we create a ``Polyatomic`` lattice with the
-same primitive vectors and 2 sites in the basis.
+We can also create a ``Polyatomic`` lattice with the same primitive vectors and
+two sites in the basis:
+
+.. literalinclude:: faq.py
+    :start-after: #HIDDEN_BEGIN_lattice_polyatomic
+    :end-before: #HIDDEN_END_lattice_polyatomic
 
-The two sublattices are equivalent to the two monatomic lattices that we
-created previously. Because a ``Polyatomic`` lattice knows about its
-sublattices, we can do things like calculate neighboring sites, even between
-sublattices, which would not be possible with the two separate ``Monatomic``
-lattices.
+The two sublattices ``sub_a`` and ``sub_b`` are nothing else than ``Monatomic``
+instances, and are equivalent to ``lat_a`` and ``lat_b`` that we created
+previously.  The advantage of the second approach is that there is now a
+``Polyatomic`` object that is aware of both of its sublattices, and we can do
+things like calculate neighboring sites, even between sublattices, which would
+not be possible with the two separate ``Monatomic`` lattices.
 
-the `kwant.lattice` module also defines several functions, such as
-`~kwant.lattice.square` and `~kwant.lattice.honeycomb`, which serve as a
-convenience for creating lattices of common types, without having to
-explicitly specify all of the lattice vectors and basis vectors.
+The `kwant.lattice` module also defines several convenience functions, such as
+`~kwant.lattice.square` and `~kwant.lattice.honeycomb`, for creating lattices
+of common types, without having to explicitly specify all of the lattice
+vectors and basis vectors.
 
 
-How do I plot a polyatomic lattice with different colors?
-=========================================================
-In the following example we shall use a kagome lattice, which has 3 sublattices.
+When plotting, how to color the different sublattices differently?
+==================================================================
+In the following example we shall use a kagome lattice, which has three sublattices.
 
 .. literalinclude:: faq.py
     :start-after: #HIDDEN_BEGIN_colors1
@@ -119,34 +182,18 @@ As we can see below, we create a new plotting function that assigns a color for
 .. image:: ../images/faq_colors.*
 
 
-What is a hopping?
-==================
-A hopping is simply a pair of sites, which defines an edge of the graph
-that makes up our tight-binding model.
+How to create many similar hoppings in one go?
+==============================================
+This can be achieved with an instance of the class `kwant.builder.HoppingKind`.
+In fact, sites and hoppings are not the only possible keys when assigning
+values to a `~kwant.builder.Builder`.  There exists a mechanism to
+`~kwant.builder.Builder.expand` more general keys into these simple keys.
 
-Starting from the example code from `What is a site?`_, we can add a hopping
-to our system in the following way:
-
-.. literalinclude:: faq.py
-    :start-after: #HIDDEN_BEGIN_hopping
-    :end-before: #HIDDEN_END_hopping
-
-.. image:: ../images/faq_hopping.*
-
-Visually, we represent a hopping as a line that joins two sites.
-
-Whenever we add a hopping ``(site_a, site_b)`` to a system and assign it a
-value ``v``, implicitly the hopping ``(site_b, site_a)`` is also added, with
-value the Hermitian conjugate of ``v``.
-
-
-How do I create all hoppings in a given direction?
-==================================================
-This can be obtained using a `~kwant.builder.HoppingKind`. A ``HoppingKind`` is
-a way of specifying all hoppings of a particular "kind", between two site
-families. For example ``HoppingKind((1, 0), lat_a, lat_b)`` represents all
-hoppings of the form ``(lat_a(x + (1, 0)), lat_b(x))``, where ``x`` is a tag
-(here, a pair of integers).
+A ``HoppingKind``, the most comonly used general key, is a way of specifying
+all hoppings of a particular "kind", between two site families. For example
+``HoppingKind((1, 0), lat_a, lat_b)`` represents all hoppings of the form
+``(lat_a(x + (1, 0)), lat_b(x))``, where ``x`` is a tag (here, a pair of
+integers).
 
 The following example shows how this can be used:
 
@@ -177,10 +224,10 @@ Here, we create hoppings between the sites of the same lattice coordinates but f
 .. image:: ../images/faq_direction3.*
 
 
-How do I create the hoppings between adjacent sites?
-====================================================
+How to set the hoppings between adjacent sites?
+===============================================
 ``Polyatomic`` and ``Monatomic`` lattices have a method `~kwant.lattice.Polyatomic.neighbors`
-that returns a (or several) ``HoppingKind`` that connects sites with their
+that returns a list of ``HoppingKind`` instances that connect sites with their
 (n-nearest) neighors:
 
 .. literalinclude:: faq.py
@@ -199,7 +246,6 @@ sublattices:
     :start-after: #HIDDEN_BEGIN_adjacent2
     :end-before: #HIDDEN_END_adjacent2
 
-
 .. image:: ../images/faq_adjacent3.*
 
 However, if we use the ``neighbors()`` method of a single sublattice, we will
@@ -216,10 +262,11 @@ is an artifact of the visualisation: the red and green sites just happen to lie
 in the path of the hoppings, but are not connected by them.
 
 
-How do I make a hole in a system?
-=================================
-To make a hole in the system, we use ``del syst[site]``. In the following
-example we remove all sites inside some "hole" region:
+How to make a hole in a system?
+===============================
+To make a hole in the system, use ``del syst[site]``, just like with any other
+mapping. In the following example we remove all sites inside some "hole"
+region:
 
 .. literalinclude:: faq.py
     :start-after: #HIDDEN_BEGIN_hole
@@ -232,8 +279,8 @@ example we remove all sites inside some "hole" region:
 If a site is deleted, then all the hoppings to/from that site are also deleted.
 
 
-How can I get access to a system's sites?
-=========================================
+How to access a system's sites?
+===============================
 The ways of accessing system sites is slightly different depending on whether
 we are talking about a ``Builder`` or ``System`` (see `What is a system, and
 what is a builder?`_ if you do not know the difference).
@@ -268,8 +315,8 @@ the index of a given site within the system:
     :end-before: #HIDDEN_END_sites3
 
 
-How do I create a lead with a lattice different from the scattering region?
-===========================================================================
+How to use different lattices for the scattering region and a lead?
+===================================================================
 Let us take the example of a system containing sites from a honeycomb lattice,
 which we want to connect to leads that contain sites from a square lattice.
 
@@ -279,7 +326,7 @@ First we construct the central system:
     :start-after: #HIDDEN_BEGIN_different_lattice1
     :end-before: #HIDDEN_END_different_lattice1
 
-.. image:: ../images/faq_different_latticea1.*
+.. image:: ../images/faq_different_lattice1.*
 
 and the lead:
 
@@ -287,7 +334,7 @@ and the lead:
     :start-after: #HIDDEN_BEGIN_different_lattice2
     :end-before: #HIDDEN_END_different_lattice2
 
-.. image:: ../images/faq_different_latticea2.*
+.. image:: ../images/faq_different_lattice2.*
 
 We cannot simply use `~kwant.builder.Builder.attach_lead` to attach this lead to the
 system with the honeycomb lattice because Kwant does not know how sites from
@@ -300,7 +347,7 @@ add the hoppings from these sites to the sites from the honeycomb lattice:
     :start-after: #HIDDEN_BEGIN_different_lattice3
     :end-before: #HIDDEN_END_different_lattice3
 
-.. image:: ../images/faq_different_latticea3.*
+.. image:: ../images/faq_different_lattice3.*
 
 ``attach_lead()`` will now be able to attach the lead:
 
@@ -308,11 +355,11 @@ add the hoppings from these sites to the sites from the honeycomb lattice:
     :start-after: #HIDDEN_BEGIN_different_lattice4
     :end-before: #HIDDEN_END_different_lattice4
 
-.. image:: ../images/faq_different_latticea4.*
+.. image:: ../images/faq_different_lattice4.*
 
 
-How do I cut a finite system out of a system with translational symmetries?
-===========================================================================
+How to cut a finite system out of a system with translational symmetries?
+=========================================================================
 This can be achieved using the `~kwant.builder.Builder.fill` method to fill a
 ``Builder`` with a ``Builder`` with higher symmetry.
 
@@ -392,9 +439,9 @@ those that have *negative* velocities:
 
 How does Kwant order components of an individual wavefunction?
 ==============================================================
-In `How can I get access to a system's sites?`_ we saw that the sites of a finalized system
-are available as a list through the ``sites`` attribute, and that one can look up the index
-of a site with the ``id_by_site`` attribute.
+In `How to access a system's sites?`_ we saw that the sites of a
+finalized system are available as a list through the ``sites`` attribute, and
+that one can look up the index of a site with the ``id_by_site`` attribute.
 
 When all the site families present in a system have only 1 degree of freedom
 per site (i.e.  the all the onsites are scalars) then the index into a