diff --git a/doc/Breakout.html b/doc/Breakout.html
--- a/doc/Breakout.html
+++ b/doc/Breakout.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="generator" content="pandoc" /><link rel="stylesheet" href="hscolour.css" type="text/css" media="all" />
-</head><body><h1 id="elerea-breakout-example">Elerea Breakout example</h1><p>Breakout is one of the simplest test applications that brings up some problems with non-trivial solutions. In particular, there is a circular dependency between the position and the velocity of the ball. The position is the integral of the velocity, while velocity can have instantaneous changes due to collisions, which is a function of the position of the ball and the current state of the field. The field is dynamic, and it also forms a mutual dependency loop with the ball position. On top of these, part of the field (at least if we regard the paddle as part of it) depends on user input, and its effects start propagating in the game state as soon as the ball reaches the level of the paddle.</p><p>Elerea lets us express all these circular dependencies in a natural way, by simply referring to the respective signals by their names. User input is also seen as a signal from inside the reactive part, while the imperative framework is given a sink fuction to update it as needed. Type safety is ensured all the way.</p><img src="Breakout.png" alt="Elerea Breakout in action" /><p>Below follows the full source of the example.</p><pre><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>module</span> <span class='hs-conid'>Main</span> <span class='hs-keyword'>where</span>
+</head><body><h1 id="elerea-breakout-example">Elerea Breakout example</h1><p>Breakout is one of the simplest test applications that brings up some problems with non-trivial solutions. In particular, there is a circular dependency between the position and the velocity of the ball. The position is the integral of the velocity, while velocity can have instantaneous changes due to collisions, which is a function of the position of the ball and the current state of the field. The field is dynamic, and it also forms a mutual dependency loop with the ball position. On top of these, part of the field (at least if we regard the paddle as part of it) depends on user input, and its effects start propagating in the game state as soon as the ball reaches the level of the paddle.</p><p>Elerea lets us express all these circular dependencies in a natural way, by simply referring to the respective signals by their names. User input is also seen as a signal from inside the reactive part, while the imperative framework is given a sink fuction to update it as needed. Type safety is ensured all the way.</p><img src="Breakout.png" alt="Elerea Breakout in action" /><p>You can also have the program output the signal structure in <a href="http://www.graphviz.org/">Graphviz</a> dot format with the <code>--dump-dot</code> switch after the game is over. For instance, if Graphviz is installed, you can get an SVG rendition of the graph using the following command:</p><p><code>elerea-breakout --dump-dot | dot -Tsvg -o breakout.svg</code></p><p>Below follows the full source of the example.</p><pre><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>module</span> <span class='hs-conid'>Main</span> <span class='hs-keyword'>where</span>
 <span class='hs-varop'>&gt;</span> 
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Concurrent</span>
@@ -8,8 +8,10 @@
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>FRP</span><span class='hs-varop'>.</span><span class='hs-conid'>Elerea</span>
+<span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>FRP</span><span class='hs-varop'>.</span><span class='hs-conid'>Elerea</span><span class='hs-varop'>.</span><span class='hs-conid'>Graph</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>UI</span><span class='hs-varop'>.</span><span class='hs-conid'>GLFW</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>GLFW</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>Rendering</span><span class='hs-varop'>.</span><span class='hs-conid'>OpenGL</span>
+<span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Environment</span>
 <span class='hs-varop'>&gt;</span> 
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Common</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span>
 <span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Common</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span>
@@ -50,11 +52,17 @@
 <span class='hs-varop'>&gt;</span> 
 <span class='hs-varop'>&gt;</span>   <span class='hs-comment'>-- All we need to get going is an IO-valued signal and an IO</span>
 <span class='hs-varop'>&gt;</span>   <span class='hs-comment'>-- function to update the external signals</span>
-<span class='hs-varop'>&gt;</span>   <span class='hs-varid'>driveNetwork</span> <span class='hs-layout'>(</span><span class='hs-varid'>breakout</span> <span class='hs-varid'>mousePosition</span> <span class='hs-varid'>windowSize</span><span class='hs-layout'>)</span>
-<span class='hs-varop'>&gt;</span>                <span class='hs-layout'>(</span><span class='hs-varid'>readInput</span> <span class='hs-varid'>mousePositionSink</span> <span class='hs-varid'>closed</span><span class='hs-layout'>)</span>
+<span class='hs-varop'>&gt;</span>   <span class='hs-keyword'>let</span> <span class='hs-varid'>game</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>breakout</span> <span class='hs-varid'>mousePosition</span> <span class='hs-varid'>windowSize</span>
+<span class='hs-varop'>&gt;</span>   <span class='hs-varid'>driveNetwork</span> <span class='hs-varid'>game</span> <span class='hs-layout'>(</span><span class='hs-varid'>readInput</span> <span class='hs-varid'>mousePositionSink</span> <span class='hs-varid'>closed</span><span class='hs-layout'>)</span>
 <span class='hs-varop'>&gt;</span> 
 <span class='hs-varop'>&gt;</span>   <span class='hs-comment'>-- The inevitable sad ending</span>
 <span class='hs-varop'>&gt;</span>   <span class='hs-varid'>closeWindow</span>
+<span class='hs-varop'>&gt;</span>
+<span class='hs-varop'>&gt;</span>   <span class='hs-comment'>-- Providing input for graphviz</span>
+<span class='hs-varop'>&gt;</span>   <span class='hs-varid'>args</span> <span class='hs-keyglyph'>&larr;</span> <span class='hs-varid'>getArgs</span>
+<span class='hs-varop'>&gt;</span>   <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-str'>"--dump-dot"</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
+<span class='hs-varop'>&gt;</span>     <span class='hs-varid'>gameGraph</span> <span class='hs-keyglyph'>&larr;</span> <span class='hs-varid'>signalToDot</span> <span class='hs-varid'>game</span>
+<span class='hs-varop'>&gt;</span>     <span class='hs-varid'>putStr</span> <span class='hs-varid'>gameGraph</span>
 </pre><p>The <code>breakout</code> function creates a reactive signal that carries the rendering actions to be performed at each instant. The principal signals forming the game logic are the following:</p><ul><li><code>playerX</code>: the position of the player, a direct function of the mouse position;</li><li><code>ballPos</code>: the position of the ball given as an integral of its velocity, <code>ballVel</code>;</li><li><code>bricks</code>: the collection of live and dying bricks along with collision information.</li></ul><p>The position and velocity of the ball form a circular dependency, as velocity is changed whenever a collision is detected, which is a function of the position.</p><p>The signal carrying the collection of the bricks is obtained by applying a stateful transformation (a transfer function) on the ball position. The state contains the bricks still relevant to the game as well as collision information. Although the latter is technically redundant, it is still worth including here, since it has to be calculated while advancing the state of the bricks, and it is needed elsewhere too.</p><pre><span class='hs-varop'>&gt;</span> <span class='hs-varid'>breakout</span> <span class='hs-varid'>mousePos</span> <span class='hs-varid'>windowSize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderLevel</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>playerX</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>ballPos</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBricks</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>bricks</span><span class='hs-layout'>)</span>
 <span class='hs-varop'>&gt;</span>     <span class='hs-keyword'>where</span> 
 </pre><p>User-driven player position:</p><pre><span class='hs-varop'>&gt;</span>           <span class='hs-varid'>playerX</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>adjustPlayerPos</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>mousePos</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>windowSize</span>
diff --git a/elerea-examples.cabal b/elerea-examples.cabal
--- a/elerea-examples.cabal
+++ b/elerea-examples.cabal
@@ -1,5 +1,5 @@
 Name:                elerea-examples
-Version:             0.2.0
+Version:             0.3.0
 Cabal-Version:       >= 1.2
 Synopsis:            Example applications for Elerea
 Category:            reactivity, FRP
@@ -15,7 +15,10 @@
   * chase: a minimal example that demonstrates reactivity and mutually
     recursive signals
   .
-  * breakout: a not too fancy breakout clone
+  * breakout: a not too fancy breakout clone that also demonstrates
+    Graphviz output; you can get an SVG rendition of the signal
+    structure with the following command if Graphviz is installed:
+    @elerea-breakout --dump-dot | dot -Tsvg -o breakout.svg@
 
 Author:              Patai Gergely
 Maintainer:          Patai Gergely (patai@iit.bme.hu)
@@ -38,12 +41,12 @@
   Executable:        elerea-breakout
   HS-Source-Dirs:    src
   Main-IS:           Breakout.lhs
-  Build-Depends:     base, elerea, OpenGL, GLFW
+  Build-Depends:     base, elerea >= 0.3, OpenGL, GLFW
   GHC-Options:       -O2
 
 Executable elerea-chase
   Executable:        elerea-chase
   HS-Source-Dirs:    src
   Main-IS:           Chase.lhs
-  Build-Depends:     base, elerea, OpenGL, GLFW
+  Build-Depends:     base, elerea >= 0.2, OpenGL, GLFW
   GHC-Options:       -O2
diff --git a/src/Breakout.lhs b/src/Breakout.lhs
--- a/src/Breakout.lhs
+++ b/src/Breakout.lhs
@@ -21,6 +21,14 @@
 
 <img src="Breakout.png" alt="Elerea Breakout in action" />
 
+You can also have the program output the signal structure in
+[Graphviz](http://www.graphviz.org/) dot format with the `--dump-dot`
+switch after the game is over.  For instance, if Graphviz is
+installed, you can get an SVG rendition of the graph using the
+following command:
+
+`elerea-breakout --dump-dot | dot -Tsvg -o breakout.svg`
+
 Below follows the full source of the example.
 
 > module Main where
@@ -32,8 +40,10 @@
 > import Data.List
 > import Data.Maybe
 > import FRP.Elerea
+> import FRP.Elerea.Graph
 > import Graphics.UI.GLFW as GLFW
 > import Graphics.Rendering.OpenGL
+> import System.Environment
 > 
 > import Common.Utils
 > import Common.Vector
@@ -114,11 +124,17 @@
 > 
 >   -- All we need to get going is an IO-valued signal and an IO
 >   -- function to update the external signals
->   driveNetwork (breakout mousePosition windowSize)
->                (readInput mousePositionSink closed)
+>   let game = breakout mousePosition windowSize
+>   driveNetwork game (readInput mousePositionSink closed)
 > 
 >   -- The inevitable sad ending
 >   closeWindow
+>
+>   -- Providing input for graphviz
+>   args <- getArgs
+>   when ("--dump-dot" `elem` args) $ do
+>     gameGraph <- signalToDot game
+>     putStr gameGraph
 
 The `breakout` function creates a reactive signal that carries the
 rendering actions to be performed at each instant.  The principal
