diff --git a/Simulation/Aivika/Experiment.hs b/Simulation/Aivika/Experiment.hs
--- a/Simulation/Aivika/Experiment.hs
+++ b/Simulation/Aivika/Experiment.hs
@@ -25,7 +25,9 @@
         module Simulation.Aivika.Experiment.ExperimentSpecsWriter,
         module Simulation.Aivika.Experiment.ExperimentWriter,
         module Simulation.Aivika.Experiment.FinalTableView,
-        module Simulation.Aivika.Experiment.Utils) where
+        module Simulation.Aivika.Experiment.Utils,
+        module Simulation.Aivika.Experiment.WebPageRenderer,
+        module Simulation.Aivika.Experiment.FileRenderer) where
 
 import Simulation.Aivika.Experiment.Types
 import Simulation.Aivika.Experiment.HtmlWriter
@@ -41,3 +43,5 @@
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.FinalTableView
 import Simulation.Aivika.Experiment.Utils
+import Simulation.Aivika.Experiment.WebPageRenderer
+import Simulation.Aivika.Experiment.FileRenderer
diff --git a/Simulation/Aivika/Experiment/ExperimentSpecsView.hs b/Simulation/Aivika/Experiment/ExperimentSpecsView.hs
--- a/Simulation/Aivika/Experiment/ExperimentSpecsView.hs
+++ b/Simulation/Aivika/Experiment/ExperimentSpecsView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.ExperimentSpecsView
@@ -23,6 +23,7 @@
 import Data.Monoid
 
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.ExperimentSpecsWriter
@@ -44,18 +45,19 @@
                         experimentSpecsDescription = "It shows the experiment specs.",
                         experimentSpecsWriter      = defaultExperimentSpecsWriter }
 
-instance WebPageRendering r => ExperimentView ExperimentSpecsView r WebPageWriter where  
+instance ExperimentView ExperimentSpecsView (WebPageRenderer a) where  
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newExperimentSpecs v exp
-             let writer =
+             let context =
+                   WebPageContext $
                    WebPageWriter { reporterWriteTOCHtml = experimentSpecsTOCHtml st,
                                    reporterWriteHtml    = experimentSpecsHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = return (),
                                          reporterSimulate   = const $ return mempty,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
     in ExperimentGenerator { generateReporter = reporter }
   
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs b/Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs
--- a/Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs
+++ b/Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs
@@ -67,7 +67,7 @@
     experimentSpecsRungeKutta4Text = "the 4-th order Runge-Kutta",
     experimentSpecsFormatter = id,
     experimentSpecsWrite = \writer exp ->
-      do let format x = experimentSpecsFormatter writer (show x)
+      do let format x = experimentSpecsFormatter writer x
          writeHtml "<p>"
          writeHtml "<table frame='border' cellspacing='4' width='"
          writeHtml $ show $ experimentSpecsWidth writer
@@ -84,7 +84,7 @@
          writeHtmlText $ experimentSpecsStartTimeText writer 
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ spcStartTime $ experimentSpecs exp
+         writeHtmlText $ format $ show $ spcStartTime $ experimentSpecs exp
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -92,7 +92,7 @@
          writeHtmlText $ experimentSpecsStopTimeText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ spcStopTime $ experimentSpecs exp
+         writeHtmlText $ format $ show $ spcStopTime $ experimentSpecs exp
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -100,7 +100,7 @@
          writeHtmlText $ experimentSpecsDTText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ spcDT $ experimentSpecs exp
+         writeHtmlText $ format $ show $ spcDT $ experimentSpecs exp
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -108,7 +108,7 @@
          writeHtmlText $ experimentSpecsRunCountText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ experimentRunCount exp
+         writeHtmlText $ format $ show $ experimentRunCount exp
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
diff --git a/Simulation/Aivika/Experiment/FileRenderer.hs b/Simulation/Aivika/Experiment/FileRenderer.hs
new file mode 100644
--- /dev/null
+++ b/Simulation/Aivika/Experiment/FileRenderer.hs
@@ -0,0 +1,33 @@
+
+{-# LANGUAGE TypeFamilies #-}
+
+-- |
+-- Module     : Simulation.Aivika.Experiment.Types
+-- Copyright  : Copyright (c) 2012-2014, David Sorokin <david.sorokin@gmail.com>
+-- License    : BSD3
+-- Maintainer : David Sorokin <david.sorokin@gmail.com>
+-- Stability  : experimental
+-- Tested with: GHC 7.8.3
+--
+-- It defines a renderer that saves the results in files when running the simulation experiment.
+--
+
+module Simulation.Aivika.Experiment.FileRenderer where
+
+import Simulation.Aivika.Experiment.Types
+
+-- | It defines a simulation 'Experiment' renderer that saves the results in files. 
+data FileRenderer a = FileRenderer a
+                      -- ^ A file renderer that depends on the provided parameter.
+
+-- | A convenient type synonym for describing a file generator.
+type FileGenerator a = ExperimentGenerator (FileRenderer a)
+
+-- | Saving the results of simulation in files when running the experiment.
+instance ExperimentRendering (FileRenderer a) where
+
+  -- | A file rendering context.
+  data ExperimentContext (FileRenderer a) = FileContext
+                                            -- ^ A file context constructor.
+  
+  renderExperiment e r reporters path = return ()
diff --git a/Simulation/Aivika/Experiment/FinalStatsView.hs b/Simulation/Aivika/Experiment/FinalStatsView.hs
--- a/Simulation/Aivika/Experiment/FinalStatsView.hs
+++ b/Simulation/Aivika/Experiment/FinalStatsView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.FinalStatsView
@@ -26,6 +26,7 @@
 
 import Simulation.Aivika
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.SamplingStatsWriter
@@ -59,18 +60,19 @@
                    finalStatsTransform   = id,
                    finalStatsSeries      = id }
 
-instance WebPageRendering r => ExperimentView FinalStatsView r WebPageWriter where
+instance ExperimentView FinalStatsView (WebPageRenderer a) where
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newFinalStats v exp dir
-             let writer =
+             let context =
+                   WebPageContext $
                    WebPageWriter { reporterWriteTOCHtml = finalStatsTOCHtml st,
                                    reporterWriteHtml    = finalStatsHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = return (),
                                          reporterSimulate   = simulateFinalStats st,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
     in ExperimentGenerator { generateReporter = reporter }
   
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/FinalTableView.hs b/Simulation/Aivika/Experiment/FinalTableView.hs
--- a/Simulation/Aivika/Experiment/FinalTableView.hs
+++ b/Simulation/Aivika/Experiment/FinalTableView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.FinalTableView
@@ -31,6 +31,8 @@
 
 import Simulation.Aivika
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
+import Simulation.Aivika.Experiment.FileRenderer
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.MRef
@@ -95,18 +97,30 @@
                    finalTableTransform   = expandResults,
                    finalTableSeries      = id }
 
-instance WebPageRendering r => ExperimentView FinalTableView r WebPageWriter where
+instance ExperimentView FinalTableView (WebPageRenderer a) where
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newFinalTable v exp dir
-             let writer =
+             let context =
+                   WebPageContext
                    WebPageWriter { reporterWriteTOCHtml = finalTableTOCHtml st,
                                    reporterWriteHtml    = finalTableHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = finaliseFinalTable st,
                                          reporterSimulate   = simulateFinalTable st,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
+    in ExperimentGenerator { generateReporter = reporter }
+
+instance ExperimentView FinalTableView (FileRenderer a) where
+  
+  outputView v = 
+    let reporter exp renderer dir =
+          do st <- newFinalTable v exp dir
+             return ExperimentReporter { reporterInitialise = return (),
+                                         reporterFinalise   = finaliseFinalTable st,
+                                         reporterSimulate   = simulateFinalTable st,
+                                         reporterContext    = FileContext }
     in ExperimentGenerator { generateReporter = reporter }
   
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/LastValueView.hs b/Simulation/Aivika/Experiment/LastValueView.hs
--- a/Simulation/Aivika/Experiment/LastValueView.hs
+++ b/Simulation/Aivika/Experiment/LastValueView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.LastValueView
@@ -26,6 +26,7 @@
 
 import Simulation.Aivika
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.Utils (replace)
@@ -65,18 +66,19 @@
                   lastValueTransform   = id,
                   lastValueSeries      = id }
   
-instance WebPageRendering r => ExperimentView LastValueView r WebPageWriter where  
+instance ExperimentView LastValueView (WebPageRenderer a) where  
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newLastValues v exp
-             let writer =
+             let context =
+                   WebPageContext $
                    WebPageWriter { reporterWriteTOCHtml = lastValueTOCHtml st,
                                    reporterWriteHtml    = lastValueHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = return (),
                                          reporterSimulate   = simulateLastValues st,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
     in ExperimentGenerator { generateReporter = reporter }
 
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/SamplingStatsWriter.hs b/Simulation/Aivika/Experiment/SamplingStatsWriter.hs
--- a/Simulation/Aivika/Experiment/SamplingStatsWriter.hs
+++ b/Simulation/Aivika/Experiment/SamplingStatsWriter.hs
@@ -55,7 +55,7 @@
     samplingStatsCountText = "count",
     samplingStatsFormatter = id,
     samplingStatsWrite = \writer name stats ->
-      do let format x = samplingStatsFormatter writer (show x)
+      do let format x = samplingStatsFormatter writer x
          writeHtml "<p>"
          writeHtml "<table frame='border' cellspacing='4' width='"
          writeHtml $ show $ samplingStatsWidth writer
@@ -72,7 +72,7 @@
          writeHtmlText $ samplingStatsMeanText writer 
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ samplingStatsMean stats
+         writeHtmlText $ format $ show $ samplingStatsMean stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -80,7 +80,7 @@
          writeHtmlText $ samplingStatsDeviationText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ samplingStatsDeviation stats
+         writeHtmlText $ format $ show $ samplingStatsDeviation stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -88,7 +88,7 @@
          writeHtmlText $ samplingStatsMinText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ samplingStatsMin stats
+         writeHtmlText $ format $ show $ samplingStatsMin stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -96,7 +96,7 @@
          writeHtmlText $ samplingStatsMaxText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ samplingStatsMax stats
+         writeHtmlText $ format $ show $ samplingStatsMax stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -104,7 +104,7 @@
          writeHtmlText $ samplingStatsCountText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtml $ format $ samplingStatsCount stats
+         writeHtml $ format $ show $ samplingStatsCount stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "</table>" 
diff --git a/Simulation/Aivika/Experiment/TableView.hs b/Simulation/Aivika/Experiment/TableView.hs
--- a/Simulation/Aivika/Experiment/TableView.hs
+++ b/Simulation/Aivika/Experiment/TableView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.TableView
@@ -30,6 +30,8 @@
 
 import Simulation.Aivika
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
+import Simulation.Aivika.Experiment.FileRenderer
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.Utils (replace)
@@ -113,18 +115,30 @@
               tableTransform   = expandResults,
               tableSeries      = id }
   
-instance WebPageRendering r => ExperimentView TableView r WebPageWriter where
+instance ExperimentView TableView (WebPageRenderer a) where
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newTable v exp dir
-             let writer =
+             let context =
+                   WebPageContext $
                    WebPageWriter { reporterWriteTOCHtml = tableTOCHtml st,
                                    reporterWriteHtml    = tableHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = return (),
                                          reporterSimulate   = simulateTable st,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
+    in ExperimentGenerator { generateReporter = reporter }
+  
+instance ExperimentView TableView (FileRenderer a) where
+  
+  outputView v = 
+    let reporter exp renderer dir =
+          do st <- newTable v exp dir
+             return ExperimentReporter { reporterInitialise = return (),
+                                         reporterFinalise   = return (),
+                                         reporterSimulate   = simulateTable st,
+                                         reporterContext    = FileContext }
     in ExperimentGenerator { generateReporter = reporter }
   
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/TimingStatsView.hs b/Simulation/Aivika/Experiment/TimingStatsView.hs
--- a/Simulation/Aivika/Experiment/TimingStatsView.hs
+++ b/Simulation/Aivika/Experiment/TimingStatsView.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.TimingStatsView
@@ -27,6 +27,7 @@
 
 import Simulation.Aivika
 import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.WebPageRenderer
 import Simulation.Aivika.Experiment.ExperimentWriter
 import Simulation.Aivika.Experiment.HtmlWriter
 import Simulation.Aivika.Experiment.TimingStatsWriter
@@ -70,18 +71,19 @@
                     timingStatsTransform   = id,
                     timingStatsSeries      = id }
 
-instance WebPageRendering r => ExperimentView TimingStatsView r WebPageWriter where  
+instance ExperimentView TimingStatsView (WebPageRenderer a) where  
   
   outputView v = 
     let reporter exp renderer dir =
           do st <- newTimingStats v exp
-             let writer =
+             let context =
+                   WebPageContext $
                    WebPageWriter { reporterWriteTOCHtml = timingStatsTOCHtml st,
                                    reporterWriteHtml    = timingStatsHtml st }
              return ExperimentReporter { reporterInitialise = return (),
                                          reporterFinalise   = return (),
                                          reporterSimulate   = simulateTimingStats st,
-                                         reporterRequest    = writer }
+                                         reporterContext    = context }
     in ExperimentGenerator { generateReporter = reporter }
   
 -- | The state of the view.
diff --git a/Simulation/Aivika/Experiment/TimingStatsWriter.hs b/Simulation/Aivika/Experiment/TimingStatsWriter.hs
--- a/Simulation/Aivika/Experiment/TimingStatsWriter.hs
+++ b/Simulation/Aivika/Experiment/TimingStatsWriter.hs
@@ -55,7 +55,7 @@
     timingStatsMaxText = "maximum",
     timingStatsFormatter = id,
     timingStatsWrite = \writer name stats ->
-      do let format x = timingStatsFormatter writer (show x)
+      do let format x = timingStatsFormatter writer x
          writeHtml "<p>"
          writeHtml "<table frame='border' cellspacing='4' width='"
          writeHtml $ show $ timingStatsWidth writer
@@ -72,7 +72,7 @@
          writeHtmlText $ timingStatsMeanText writer 
          writeHtml "</td>"
          writeHtml "<td colspan='2'>"
-         writeHtmlText $ format $ timingStatsMean stats
+         writeHtmlText $ format $ show $ timingStatsMean stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -80,7 +80,7 @@
          writeHtmlText $ timingStatsDeviationText writer
          writeHtml "</td>"
          writeHtml "<td colspan='2'>"
-         writeHtmlText $ format $ timingStatsDeviation stats
+         writeHtmlText $ format $ show $ timingStatsDeviation stats
          writeHtml "</td>"
          writeHtml "</tr>"
          writeHtml "<tr>"
@@ -88,13 +88,13 @@
          writeHtmlText $ timingStatsMinText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ timingStatsMin stats
+         writeHtmlText $ format $ show $ timingStatsMin stats
          writeHtml "</td>"
          writeHtml "<td>"
          writeHtmlText "("
          writeHtmlText $ timingStatsTimeText writer
          writeHtmlText " = "
-         writeHtmlText $ format $ timingStatsMinTime stats
+         writeHtmlText $ format $ show $ timingStatsMinTime stats
          writeHtmlText ")"
          writeHtml "</td>"
          writeHtml "</tr>"
@@ -103,13 +103,13 @@
          writeHtmlText $ timingStatsMaxText writer
          writeHtml "</td>"
          writeHtml "<td>"
-         writeHtmlText $ format $ timingStatsMax stats
+         writeHtmlText $ format $ show $ timingStatsMax stats
          writeHtml "</td>"
          writeHtml "<td>"
          writeHtmlText "("
          writeHtmlText $ timingStatsTimeText writer
          writeHtmlText " = "
-         writeHtmlText $ format $ timingStatsMaxTime stats
+         writeHtmlText $ format $ show $ timingStatsMaxTime stats
          writeHtmlText ")"
          writeHtml "</td>"
          writeHtml "</tr>"
@@ -119,9 +119,9 @@
          writeHtml "</td>"
          writeHtml "<td colspan='2'>"
          writeHtml "["
-         writeHtml $ format $ timingStatsStartTime stats
+         writeHtml $ format $ show $ timingStatsStartTime stats
          writeHtml "; "
-         writeHtml $ format $ timingStatsLastTime stats
+         writeHtml $ format $ show $ timingStatsLastTime stats
          writeHtml "]"
          writeHtml "</td>"
          writeHtml "</tr>"
diff --git a/Simulation/Aivika/Experiment/Types.hs b/Simulation/Aivika/Experiment/Types.hs
--- a/Simulation/Aivika/Experiment/Types.hs
+++ b/Simulation/Aivika/Experiment/Types.hs
@@ -1,5 +1,5 @@
 
-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts #-}
+{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}
 
 -- |
 -- Module     : Simulation.Aivika.Experiment.Types
@@ -19,42 +19,21 @@
 -- views are provided.
 --
 
-module Simulation.Aivika.Experiment.Types
-       (-- * General Definitions
-        Experiment(..),
-        ExperimentRendering(..),
-        defaultExperiment,
-        runExperiment,
-        runExperimentParallel,
-        ExperimentData(..),
-        ExperimentView(..),
-        ExperimentGenerator(..),
-        ExperimentReporter(..),
-        -- * Web Page Rendering
-        WebPageRendering(..),
-        WebPageRenderer(..),
-        WebPageWriter(..),
-        WebPageGenerator(..)) where
+module Simulation.Aivika.Experiment.Types where
 
 import Control.Monad
 import Control.Monad.State
 import Control.Concurrent.ParallelIO.Local
 
-import qualified Data.Map as M
-
-import Data.Ix
 import Data.Maybe
 import Data.Monoid
 
-import qualified System.IO.UTF8 as UTF8
 import System.Directory
 import System.FilePath
 
 import GHC.Conc (getNumCapabilities)
 
 import Simulation.Aivika
-import Simulation.Aivika.Experiment.HtmlWriter
-import Simulation.Aivika.Experiment.Utils (replace)
 import Simulation.Aivika.Experiment.ExperimentWriter
 
 -- | It defines the simulation experiment with the specified rendering backend and its bound data.
@@ -94,25 +73,28 @@
                experimentNumCapabilities = getNumCapabilities }
 
 -- | It allows rendering the simulation results in an arbitrary way.
-class ExperimentRendering r a | r -> a where
+class ExperimentRendering r where
 
+  -- | Defines a context used when rendering the experiment.
+  data ExperimentContext r :: *
+
   -- | Render the experiment after the simulation is finished, for example,
   -- creating the @index.html@ file in the specified directory.
-  renderExperiment :: Experiment -> r -> [ExperimentReporter a] -> FilePath -> ExperimentWriter ()
+  renderExperiment :: Experiment -> r -> [ExperimentReporter r] -> FilePath -> ExperimentWriter ()
 
 -- | This is a generator of the reporter with the specified rendering backend.                     
-data ExperimentGenerator r a = 
-  ExperimentGenerator { generateReporter :: Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter a)
+data ExperimentGenerator r = 
+  ExperimentGenerator { generateReporter :: Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter r)
                         -- ^ Generate a reporter bound up with the specified directory.
                       }
 
 -- | Defines a view in which the simulation results should be saved.
 -- You should extend this type class to define your own views such
 -- as the PDF document.
-class ExperimentRendering r a => ExperimentView v r a | r -> a where
+class ExperimentRendering r => ExperimentView v r where
   
   -- | Create a generator of the reporter.
-  outputView :: v -> ExperimentGenerator r a
+  outputView :: v -> ExperimentGenerator r
 
 -- | It describes the source simulation data used in the experiment.
 data ExperimentData =
@@ -123,7 +105,7 @@
                  }
 
 -- | Defines what creates the simulation reports by the specified renderer.
-data ExperimentReporter a =
+data ExperimentReporter r =
   ExperimentReporter { reporterInitialise :: ExperimentWriter (),
                        -- ^ Initialise the reporting before 
                        -- the simulation runs are started.
@@ -135,17 +117,17 @@
                        -- and return a finalizer that will be called 
                        -- in the stop time after the last signal is 
                        -- triggered and processed.
-                       reporterRequest    :: a
-                       -- ^ Return data requested by the renderer.
+                       reporterContext    :: ExperimentContext r
+                       -- ^ Return a context used by the renderer.
                      }
 
 -- | Run the simulation experiment sequentially. For example, 
 -- it can be a Monte-Carlo simulation dependentent on the external
 -- 'Parameter' values.
-runExperiment :: ExperimentRendering r a
+runExperiment :: ExperimentRendering r
                  => Experiment
                  -- ^ the simulation experiment to run
-                 -> [ExperimentGenerator r a]
+                 -> [ExperimentGenerator r]
                  -- ^ generators used for rendering
                  -> r
                  -- ^ the rendering backend
@@ -166,10 +148,10 @@
 -- threads directly with help of 'experimentNumCapabilities',
 -- although the real number of parallel threads can depend on many
 -- factors.
-runExperimentParallel :: ExperimentRendering r a
+runExperimentParallel :: ExperimentRendering r
                          => Experiment
                          -- ^ the simulation experiment to run
-                         -> [ExperimentGenerator r a]
+                         -> [ExperimentGenerator r]
                          -- ^ generators used for rendering
                          -> r
                          -- ^ the rendering backend
@@ -183,12 +165,12 @@
                parallel_ pool tasks
                         
 -- | Run the simulation experiment with the specified executor.
-runExperimentWithExecutor :: ExperimentRendering r a 
+runExperimentWithExecutor :: ExperimentRendering r
                              => ([IO ()] -> IO ())
                              -- ^ an executor that allows parallelizing the simulation if required
                              -> Experiment
                              -- ^ the simulation experiment to run
-                             -> [ExperimentGenerator r a]
+                             -> [ExperimentGenerator r]
                              -- ^ generators used for rendering
                              -> r
                              -- ^ the rendering backend
@@ -219,62 +201,20 @@
                     runEventWith EarlierEvents $
                     forM reporters $ \reporter ->
                     reporterSimulate reporter d
-              runEventInStopTime $
-                disposeEvent $ mconcat fs
+              let m1 =
+                    runEventInStopTime $
+                    return ()
+                  m2 =
+                    runEventInStopTime $
+                    disposeEvent $ mconcat fs
+                  mh (SimulationException e') =
+                    when (experimentVerbose e) $
+                    liftIO $
+                    do putStr "A simulation exception has been raised when running: " 
+                       putStrLn $ show e'
+              finallySimulation (catchSimulation m1 mh) m2
      liftIO $
        executor $ runSimulations simulate specs runCount
      forM_ reporters reporterFinalise
      renderExperiment e r reporters path
      return ()
-
--- | It defines the web page renderer for simulation 'Experiment'. 
-data WebPageRenderer = WebPageRenderer
-
--- | It replies to the requests made by the web page renderer.
-data WebPageWriter =
-  WebPageWriter { reporterWriteTOCHtml :: Int -> HtmlWriter (),
-                  -- ^ Return a TOC (Table of Contents) item for 
-                  -- the HTML index file after the finalisation 
-                  -- function is called, i.e. in the very end. 
-                  -- The agument specifies the ordered number of 
-                  -- the item.
-                  --
-                  -- You should wrap your HTML in 'writeHtmlListItem'.
-                  reporterWriteHtml :: Int -> HtmlWriter ()
-                  -- ^ Return an HTML code for the index file
-                  -- after the finalisation function is called,
-                  -- i.e. in the very end. The agument specifies
-                  -- the ordered number of the item.
-                }
-
--- | A subclass of renderers that know how to save the @index.html@ file
--- when rendering the simulation experiment.
-class ExperimentRendering r WebPageWriter => WebPageRendering r
-
--- | A convenient type synonym for describing the web page generators.
-type WebPageGenerator r = ExperimentGenerator r WebPageWriter
-
-instance WebPageRendering WebPageRenderer
-
-instance ExperimentRendering WebPageRenderer WebPageWriter where
-
-  renderExperiment e r reporters path = 
-    do let html :: HtmlWriter ()
-           html = 
-             writeHtmlDocumentWithTitle (experimentTitle e) $
-             do writeHtmlList $
-                  forM_ (zip [1..] reporters) $ \(i, reporter) -> 
-                  reporterWriteTOCHtml (reporterRequest reporter) i
-                writeHtmlBreak
-                unless (null $ experimentDescription e) $
-                  writeHtmlParagraph $
-                  writeHtmlText $ experimentDescription e
-                forM_ (zip [1..] reporters) $ \(i, reporter) ->
-                  reporterWriteHtml (reporterRequest reporter) i
-           file = combine path "index.html"
-       ((), contents) <- runHtmlWriter html id
-       liftIO $ do
-         UTF8.writeFile file (contents [])
-         when (experimentVerbose e) $
-           do putStr "Generated file "
-              putStrLn file
diff --git a/Simulation/Aivika/Experiment/WebPageRenderer.hs b/Simulation/Aivika/Experiment/WebPageRenderer.hs
new file mode 100644
--- /dev/null
+++ b/Simulation/Aivika/Experiment/WebPageRenderer.hs
@@ -0,0 +1,83 @@
+
+{-# LANGUAGE TypeFamilies #-}
+
+-- |
+-- Module     : Simulation.Aivika.Experiment.Types
+-- Copyright  : Copyright (c) 2012-2014, David Sorokin <david.sorokin@gmail.com>
+-- License    : BSD3
+-- Maintainer : David Sorokin <david.sorokin@gmail.com>
+-- Stability  : experimental
+-- Tested with: GHC 7.8.3
+--
+-- It defines a renderer that creates a web page when running the simulation experiment.
+--
+
+module Simulation.Aivika.Experiment.WebPageRenderer where
+
+import Control.Monad
+import Control.Monad.Trans
+
+import qualified System.IO.UTF8 as UTF8
+import System.Directory
+import System.FilePath
+
+import Simulation.Aivika
+import Simulation.Aivika.Experiment.Types
+import Simulation.Aivika.Experiment.HtmlWriter
+import Simulation.Aivika.Experiment.ExperimentWriter
+
+-- | It defines the web page renderer for simulation 'Experiment'. 
+data WebPageRenderer a = WebPageRenderer a
+                         -- ^ A renderer that depends on the provided parameter.
+
+-- | It replies to the requests made by the web page renderer.
+data WebPageWriter =
+  WebPageWriter { reporterWriteTOCHtml :: Int -> HtmlWriter (),
+                  -- ^ Return a TOC (Table of Contents) item for 
+                  -- the HTML index file after the finalisation 
+                  -- function is called, i.e. in the very end. 
+                  -- The agument specifies the ordered number of 
+                  -- the item.
+                  --
+                  -- You should wrap your HTML in 'writeHtmlListItem'.
+                  reporterWriteHtml :: Int -> HtmlWriter ()
+                  -- ^ Return an HTML code for the index file
+                  -- after the finalisation function is called,
+                  -- i.e. in the very end. The agument specifies
+                  -- the ordered number of the item.
+                }
+
+-- | A convenient type synonym for describing a web page generator.
+type WebPageGenerator a = ExperimentGenerator (WebPageRenderer a)
+
+-- | Rending a web page with results when running the simulation experiment.
+instance ExperimentRendering (WebPageRenderer a) where
+
+  -- | A web page context.
+  newtype ExperimentContext (WebPageRenderer a) =
+    WebPageContext { runWebPageContext :: WebPageWriter
+                     -- ^ Run the web page context.
+                   }
+
+  renderExperiment e r reporters path = 
+    do let html :: HtmlWriter ()
+           html = 
+             writeHtmlDocumentWithTitle (experimentTitle e) $
+             do writeHtmlList $
+                  forM_ (zip [1..] reporters) $ \(i, reporter) -> 
+                  reporterWriteTOCHtml (runWebPageContext $
+                                        reporterContext reporter) i
+                writeHtmlBreak
+                unless (null $ experimentDescription e) $
+                  writeHtmlParagraph $
+                  writeHtmlText $ experimentDescription e
+                forM_ (zip [1..] reporters) $ \(i, reporter) ->
+                  reporterWriteHtml (runWebPageContext $
+                                     reporterContext reporter) i
+           file = combine path "index.html"
+       ((), contents) <- runHtmlWriter html id
+       liftIO $ do
+         UTF8.writeFile file (contents [])
+         when (experimentVerbose e) $
+           do putStr "Generated file "
+              putStrLn file
diff --git a/aivika-experiment.cabal b/aivika-experiment.cabal
--- a/aivika-experiment.cabal
+++ b/aivika-experiment.cabal
@@ -1,5 +1,5 @@
 name:            aivika-experiment
-version:         2.1
+version:         3.0
 synopsis:        Simulation experiments for the Aivika library
 description:
     This package allows defining simulation experiments for the Aivika
@@ -41,6 +41,8 @@
                      Simulation.Aivika.Experiment.FinalTableView
                      Simulation.Aivika.Experiment.Utils
                      Simulation.Aivika.Experiment.MRef
+                     Simulation.Aivika.Experiment.WebPageRenderer
+                     Simulation.Aivika.Experiment.FileRenderer
                      
     build-depends:   base >= 3 && < 6,
                      mtl >= 1.1.0.2,
@@ -51,12 +53,10 @@
                      split >= 0.2.2,
                      network-uri >= 2.6,
                      parallel-io >= 0.3.2.1,
-                     aivika >= 2.1
+                     aivika >= 3.0
 
-    extensions:      FlexibleInstances,
-                     FlexibleContexts,
-                     MultiParamTypeClasses,
-                     FunctionalDependencies
+    extensions:      MultiParamTypeClasses,
+                     TypeFamilies
                      
     ghc-options:     -O2
 
diff --git a/examples/LinearArray.hs b/examples/LinearArray.hs
--- a/examples/LinearArray.hs
+++ b/examples/LinearArray.hs
@@ -59,7 +59,7 @@
     experimentDescription = "Model Linear Array as described in " ++
                             "the examples included in Berkeley-Madonna." }
 
-generators :: WebPageRendering r => [WebPageGenerator r]
+generators :: [WebPageGenerator a]
 generators =
   [outputView defaultExperimentSpecsView,
    outputView $ defaultTableView {
@@ -86,4 +86,4 @@
         resultByName "m" <>
         resultByName "c" } ]
 
-main = runExperiment experiment generators WebPageRenderer (model 51)
+main = runExperiment experiment generators (WebPageRenderer ()) (model 51)
diff --git a/examples/MachRep3.hs b/examples/MachRep3.hs
--- a/examples/MachRep3.hs
+++ b/examples/MachRep3.hs
@@ -43,7 +43,7 @@
     experimentRunCount = 3,
     experimentDescription = description }
 
-generators :: WebPageRendering r => [WebPageGenerator r]
+generators :: [WebPageGenerator a]
 generators =
   [outputView defaultExperimentSpecsView,
    outputView $ defaultLastValueView {
@@ -115,4 +115,4 @@
        [resultSource "x" "The proportion of up time" prop,
         resultSource "t" "Simulation time" time]
 
-main = runExperiment experiment generators WebPageRenderer model
+main = runExperiment experiment generators (WebPageRenderer ()) model
