diff --git a/doc/source/images/band_structure.py.diff b/doc/source/images/band_structure.py.diff
index a7585168982f4a2008e5215ed2742843b0137cf3..3b72444cdc6043c7e26445f6b4d376c0fcc093b2 100644
--- a/doc/source/images/band_structure.py.diff
+++ b/doc/source/images/band_structure.py.diff
@@ -1,26 +1,25 @@
 --- original
 +++ modified
-@@ -12,6 +12,7 @@
+@@ -10,6 +10,7 @@
  
- # For plotting
+ # For plotting.
  from matplotlib import pyplot
 +import _defs
  
- 
  def make_lead(a=1, t=1.0, W=10):
-@@ -38,11 +39,19 @@
-     bands = kwant.physics.Bands(lead)
-     energies = [bands(k) for k in momenta]
+     # Start with an empty lead with a single square lattice
+@@ -33,10 +34,19 @@
  
--    pyplot.figure()
-+    fig = pyplot.figure()
-     pyplot.plot(momenta, energies)
--    pyplot.xlabel("momentum [in units of (lattice constant)^-1]")
--    pyplot.ylabel("energy [in units of t]")
+ def main():
+     lead = make_lead().finalized()
+-    kwant.plotter.bands(lead, show=False)
+-    pyplot.xlabel("momentum in units of inverse lattice constant")
+-    pyplot.ylabel("energy in units of t")
 -    pyplot.show()
-+    pyplot.xlabel("momentum [in units of (lattice constant)^-1]",
++    fig = kwant.plotter.bands(lead, show=False)
++    pyplot.xlabel("momentum in units of inverse lattice constant",
 +                 fontsize=_defs.mpl_label_size)
-+    pyplot.ylabel("energy [in units of t]", fontsize=_defs.mpl_label_size)
++    pyplot.ylabel("energy in units of t", fontsize=_defs.mpl_label_size)
 +    pyplot.setp(fig.get_axes()[0].get_xticklabels(),
 +               fontsize=_defs.mpl_tick_size)
 +    pyplot.setp(fig.get_axes()[0].get_yticklabels(),
@@ -29,6 +28,7 @@
 +    fig.subplots_adjust(left=0.15, right=0.95, top=0.95, bottom=0.15)
 +    fig.savefig("band_structure_result.pdf")
 +    fig.savefig("band_structure_result.png", dpi=_defs.dpi)
++
  
  
- def main():
+ # Call the main function if the script gets executed (as opposed to imported).
diff --git a/doc/source/images/superconductor_band_structure.py.diff b/doc/source/images/superconductor_band_structure.py.diff
index 8fa888ba89672bb0a32c013e31f0b7a097fe8604..2590026c9a158c70f547e974ea25087763d5ce89 100644
--- a/doc/source/images/superconductor_band_structure.py.diff
+++ b/doc/source/images/superconductor_band_structure.py.diff
@@ -8,13 +8,13 @@
  
  tau_x = tinyarray.array([[0, 1], [1, 0]])
  tau_z = tinyarray.array([[1, 0], [0, -1]])
-@@ -46,12 +47,19 @@
-     bands = kwant.physics.Bands(lead)
-     energies = [bands(k) for k in momenta]
+@@ -46,11 +47,19 @@
+     # Make system and finalize it right away.
+     lead = make_lead().finalized()
  
--    pyplot.figure()
-+    fig = pyplot.figure()
-     pyplot.plot(momenta, energies)
+-    kwant.plotter.bands(lead, momenta=np.linspace(-1.5, 1.5, 101), show=False)
++    fig = kwant.plotter.bands(lead, momenta=np.linspace(-1.5, 1.5, 101),
++                              show=False)
      pyplot.xlabel("momentum [in untis of (lattice constant)^-1]")
      pyplot.ylabel("energy [in units of t]")
      pyplot.ylim([-0.8, 0.8])
@@ -29,4 +29,4 @@
 +    fig.savefig("superconductor_band_structure_result.png", dpi=_defs.dpi)
  
  
- def main():
+ # Call the main function if the script gets executed (as opposed to imported).
diff --git a/doc/source/reference/kwant.plotter.rst b/doc/source/reference/kwant.plotter.rst
index 0ffcae77e9671cd446aa4664ffbc4c6e9dec2cae..729d9fc0c606463c81aa88a60887b03e8bc8ad72 100644
--- a/doc/source/reference/kwant.plotter.rst
+++ b/doc/source/reference/kwant.plotter.rst
@@ -11,6 +11,7 @@ Plotting routine
 
    plot
    map
+   bands
 
 Data-generating functions
 -------------------------
diff --git a/doc/source/tutorial/band_structure.py b/doc/source/tutorial/band_structure.py
index 012d14fbbaed0ba03d461efa4d18bf415c98d111..2ad2e3dbe22e3713e814a36cad0abcd039701802 100644
--- a/doc/source/tutorial/band_structure.py
+++ b/doc/source/tutorial/band_structure.py
@@ -8,12 +8,9 @@
 
 import kwant
 
-from math import pi
-
-# For plotting
+# For plotting.
 from matplotlib import pyplot
 
-
 #HIDDEN_BEGIN_zxip
 def make_lead(a=1, t=1.0, W=10):
     # Start with an empty lead with a single square lattice
@@ -37,24 +34,12 @@ def make_lead(a=1, t=1.0, W=10):
 
 
 #HIDDEN_BEGIN_pejz
-def plot_bandstructure(lead, momenta):
-    bands = kwant.physics.Bands(lead)
-    energies = [bands(k) for k in momenta]
-
-    pyplot.figure()
-    pyplot.plot(momenta, energies)
-    pyplot.xlabel("momentum [in units of (lattice constant)^-1]")
-    pyplot.ylabel("energy [in units of t]")
-    pyplot.show()
-
-
 def main():
     lead = make_lead().finalized()
-
-    # list of momenta at which the bands should be computed
-    momenta = [-pi + 0.02 * pi * i for i in xrange(101)]
-
-    plot_bandstructure(lead, momenta)
+    kwant.plotter.bands(lead, show=False)
+    pyplot.xlabel("momentum in units of inverse lattice constant")
+    pyplot.ylabel("energy in units of t")
+    pyplot.show()
 #HIDDEN_END_pejz
 
 
diff --git a/doc/source/tutorial/superconductor_band_structure.py b/doc/source/tutorial/superconductor_band_structure.py
index 816c32f163f512950e7912e9b9a207d0a586971e..6bed20b2d61809813bad9c5f9fb5b93f636b6f8f 100644
--- a/doc/source/tutorial/superconductor_band_structure.py
+++ b/doc/source/tutorial/superconductor_band_structure.py
@@ -44,28 +44,17 @@ def make_lead(a=1, t=1.0, mu=0.7, Delta=0.1, W=10):
 #HIDDEN_END_nbvn
 
 
-def plot_bandstructure(lead, momenta):
-    bands = kwant.physics.Bands(lead)
-    energies = [bands(k) for k in momenta]
+def main():
+    # Make system and finalize it right away.
+    lead = make_lead().finalized()
 
-    pyplot.figure()
-    pyplot.plot(momenta, energies)
+    kwant.plotter.bands(lead, momenta=np.linspace(-1.5, 1.5, 101), show=False)
     pyplot.xlabel("momentum [in untis of (lattice constant)^-1]")
     pyplot.ylabel("energy [in units of t]")
     pyplot.ylim([-0.8, 0.8])
     pyplot.show()
 
 
-def main():
-    # Make system and finalize it right away.
-    lead = make_lead().finalized()
-
-    # list of momenta at which the bands should be computed
-    momenta = np.linspace(-1.5, 1.5, 201)
-
-    plot_bandstructure(lead, momenta)
-
-
 # Call the main function if the script gets executed (as opposed to imported).
 # See <http://docs.python.org/library/__main__.html>.
 if __name__ == '__main__':
diff --git a/doc/source/tutorial/tutorial3.rst b/doc/source/tutorial/tutorial3.rst
index f5b603fa8ace912334efcc2ba4e7e5efcb057590..814ab761abb81f2aaf47913fc0df3205a64b46b6 100644
--- a/doc/source/tutorial/tutorial3.rst
+++ b/doc/source/tutorial/tutorial3.rst
@@ -31,11 +31,12 @@ contained implicitly finalized versions of the attached leads.  But now we are
 working with a single lead and there is no scattering region.  So we have to
 finalized the ``Builder`` of our sole lead explicitly.
 
-That finalized lead is then passed to `kwant.physics.Bands`.  This
-creates an object that behaves just like a function: when called with a
-momentum ``k`` as parameter it returns the eigenenergies of the translational
-invariant system for that momentum.  Computing these eigenenergies for a range
-of momenta then yields the bandstructure:
+That finalized lead is then passed to `~kwant.plotter.bands`.  This function
+calculates energies of various bands at a range of momenta and plots the
+calculated energies. It is really a convenience function, and if one needs to
+do something more profound with the dispersion relation these energies may be
+calculated directly using `~kwant.physics.Bands`. For now we just plot the
+bandstructure:
 
 .. literalinclude:: band_structure.py
     :start-after: #HIDDEN_BEGIN_pejz
diff --git a/doc/source/whatsnew/0.3.rst b/doc/source/whatsnew/0.3.rst
index 577b705f86f4aed4211350352b2ea03bbda3f179..01823b4ea53b56153fb404b5153ea70b955b453e 100644
--- a/doc/source/whatsnew/0.3.rst
+++ b/doc/source/whatsnew/0.3.rst
@@ -9,6 +9,11 @@ Some renames
 * ``MonatomicLattice`` has been renamed to `~kwant.lattice.Monatomic`,
 * ``PolyatomicLattice`` has been renamed to `~kwant.lattice.Polyatomic`.
 
+Band structure plots
+--------------------
+A convenience function `~kwant.plotter.bands` for quick plotting of band
+structure was implemented.
+
 Immutable site groups
 ---------------------
 In order to make naming more consistent, `kwant.make_lattice` was renamed and
diff --git a/kwant/plotter.py b/kwant/plotter.py
index d1d276cb373bcab092b56f2f2b91c4e85bce90d4..07201851fcf19311c23c006feea6c52b8ae39f68 100644
--- a/kwant/plotter.py
+++ b/kwant/plotter.py
@@ -38,9 +38,9 @@ except ImportError:
                   "functions will work.", RuntimeWarning)
     _mpl_enabled = False
 
-from . import system, builder
+from . import system, builder, physics
 
-__all__ = ['plot', 'map', 'sys_leads_sites', 'sys_leads_hoppings',
+__all__ = ['plot', 'map', 'bands', 'sys_leads_sites', 'sys_leads_hoppings',
            'sys_leads_pos', 'sys_leads_hopping_pos', 'mask_interpolate']
 
 
@@ -849,6 +849,56 @@ def map(sys, value, colorbar=True, cmap=None,
         fig.colorbar(image)
     return output_fig(fig, file=file, show=show)
 
+
+def bands(sys, momenta=65, file=None, show=True, dpi=None, fig_size=None):
+    """Plot band structure of a translationally invariant 1D system.
+
+    Parameters
+    ----------
+    sys : kwant.system.InfiniteSystem
+        A system bands of which are to be plotted.
+    momenta : int or 1D array-like
+        Either a number of sampling points on the interval [-pi, pi], or an
+        array of points at which the band structure has to be evaluated.
+    file : string or file object or `None`
+        The output file.  If `None`, output will be shown instead.
+    show : bool
+        Whether `matplotlib.pyplot.show()` is to be called, and the output is
+        to be shown immediately.  Defaults to `True`.
+    dpi : float
+        Number of pixels per inch.  If not set the `matplotlib` default is
+        used.
+    fig_size : tuple
+        Figure size `(width, height)` in inches.  If not set, the default
+        `matplotlib` value is used.
+
+    Returns
+    -------
+    fig : matplotlib figure
+        A figure with the output.
+
+    Notes
+    -----
+    See `physics.Bands` for the calculation of dispersion without plotting.
+    """
+    momenta = np.array(momenta)
+    if momenta.ndim != 1:
+        momenta = np.linspace(-np.pi, np.pi, momenta)
+
+    bands = physics.Bands(sys)
+    energies = [bands(k) for k in momenta]
+
+    fig = Figure()
+    if dpi is not None:
+        fig.set_dpi(dpi)
+    if fig_size is not None:
+        fig.set_figwidth(fig_size[0])
+        fig.set_figheight(fig_size[1])
+    ax = fig.add_subplot(1, 1, 1)
+    ax.plot(momenta, energies)
+    return output_fig(fig, file=file, show=show)
+
+
 # TODO (Anton): Fix plotting of parts of the system using color = np.nan.
 # Not plotting sites currently works, not plotting hoppings does not.
 # TODO (Anton): Allow a more flexible treatment of position than pos_transform