diff --git a/src/implementation/solvers/CMakeLists.txt b/src/implementation/solvers/CMakeLists.txt
index 8c7d416dcca2b6565717c1bc2414feba47c9e2a7..4ea65cae1d1e31fac9f6e5738edf58808306da11 100755
--- a/src/implementation/solvers/CMakeLists.txt
+++ b/src/implementation/solvers/CMakeLists.txt
@@ -2,7 +2,8 @@ ADD_SUBDIRECTORY( linear )
 ADD_SUBDIRECTORY( pde )
 ADD_SUBDIRECTORY( ode )
 
-SET( headers tnlSolver_impl.h
+SET( headers tnlIterativeSolverMonitor_impl.h
+             tnlSolver_impl.h
              tnlSolverStarter_impl.h
              tnlSolverInitiator_impl.h )
 
diff --git a/src/implementation/solvers/ode/CMakeLists.txt b/src/implementation/solvers/ode/CMakeLists.txt
index b9d6df03dbabfcc79f97220451c0dcc827f5d03d..41f6b8b47c4c6d24d794a51ad4ee7de37a5775ae 100755
--- a/src/implementation/solvers/ode/CMakeLists.txt
+++ b/src/implementation/solvers/ode/CMakeLists.txt
@@ -1,5 +1,6 @@
 SET( headers tnlEulerSolver_impl.h
-             tnlMersonSolver_impl.h )
+             tnlMersonSolver_impl.h 
+             tnlODESolverMonitor_impl.h )
 
 INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/implementation/solvers/ode )
 
diff --git a/src/implementation/solvers/ode/tnlEulerSolver_impl.h b/src/implementation/solvers/ode/tnlEulerSolver_impl.h
index 80ce7b9d628866b2b114fcf51cfc32c1dcc25ac0..f1fccd13bf8a1549939766aeac8e929611a0bc3f 100644
--- a/src/implementation/solvers/ode/tnlEulerSolver_impl.h
+++ b/src/implementation/solvers/ode/tnlEulerSolver_impl.h
@@ -71,11 +71,7 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u )
    if( currentTau == 0.0 ) return true;
    iteration = 0;
 
-   /****
-    * Do a printout ...
-    */
-   if( this -> verbosity > 0 )
-      this -> printOut();
+   this -> refreshSolverMonitor();
 
    /****
     * Start the main loop
@@ -115,11 +111,7 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u )
          currentTau = this -> getStopTime() - time; //we don't want to keep such tau
       else this -> tau = currentTau;
 
-      /****
-       * Do printouts if verbosity is on
-       */
-      if( this -> verbosity > 1 )
-          this ->  printOut();
+      this -> refreshSolverMonitor();
 
       /****
        * Check stop conditions.
@@ -127,9 +119,8 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u )
       if( time >= this -> getStopTime() ||
           ( this -> getMaxResidue() != 0.0 && residue < this -> getMaxResidue() ) )
        {
-         if( this -> verbosity > 0 )
-            this -> printOut();
-          return true;
+         this -> refreshSolverMonitor();
+         return true;
        }
       if( iteration == this -> getMaxIterationsNumber() ) return false;
 
diff --git a/src/implementation/solvers/ode/tnlMersonSolver_impl.h b/src/implementation/solvers/ode/tnlMersonSolver_impl.h
index e16e5ae5ea62ee144c1df93a53678ff8c6c810fa..c117ca08e2d5965d3ab166e9a10890332be7d871 100644
--- a/src/implementation/solvers/ode/tnlMersonSolver_impl.h
+++ b/src/implementation/solvers/ode/tnlMersonSolver_impl.h
@@ -142,11 +142,7 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u )
    if( currentTau == 0.0 ) return true;
    iteration = 0;
 
-   /****
-    * Do a printout ...
-    */
-   if( this -> verbosity > 0 )
-      this -> printOut();
+   this -> refreshSolverMonitor();
 
    /****
     * Start the main loop
@@ -178,6 +174,7 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u )
          if( currentTau + time == this -> stopTime ) residue = lastResidue;
          time += currentTau;
          iteration ++;
+         this -> refreshSolverMonitor();
       }
 
       /****
@@ -192,11 +189,6 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u )
          currentTau = this -> getStopTime() - time; //we don't want to keep such tau
       else this -> tau = currentTau;
 
-      /****
-       * Do printouts if verbosity is on
-       */
-      if( this -> verbosity > 1 )
-          this ->  printOut();
 
       /****
        * Check stop conditions.
@@ -204,9 +196,8 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u )
       if( time >= this -> getStopTime() ||
           ( this -> getMaxResidue() != 0.0 && residue < this -> getMaxResidue() ) )
        {
-         if( this -> verbosity > 0 )
-            this -> printOut();
-          return true;
+         this -> refreshSolverMonitor();
+         return true;
        }
       if( iteration == this -> getMaxIterationsNumber() ) return false;
    }
diff --git a/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h b/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h
new file mode 100644
index 0000000000000000000000000000000000000000..9a104aa018c51916e0035cd6daadcce6b2fcfab3
--- /dev/null
+++ b/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+                          tnlODESolverMonitor_impl.h  -  description
+                             -------------------
+    begin                : Mar 12, 2013
+    copyright            : (C) 2013 by Tomas Oberhuber
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLODESOLVERMONITOR_IMPL_H_
+#define TNLODESOLVERMONITOR_IMPL_H_
+
+template< typename RealType, typename IndexType >
+tnlODESolverMonitor< RealType, IndexType> :: tnlODESolverMonitor()
+: timeStep( 0.0 ),
+  time( 0.0 )
+{
+}
+
+template< typename RealType, typename IndexType >
+void tnlODESolverMonitor< RealType, IndexType> :: refresh()
+{
+   if( this -> verbose > 0 && this -> refreshing % this -> outputPeriod == 0 )
+   {
+      // TODO: add EST
+      //cout << " EST: " << estimated;
+      cout << " ITER:" << setw( 8 ) << this -> getIterations()
+           << " TAU:" << setprecision( 5 ) << setw( 12 ) << this -> getTimeStep()
+           << " T:" << setprecision( 5 ) << setw( 12 ) << this -> getTime()
+           << " RES:" << setprecision( 5 ) << setw( 12 ) << this -> getResidue()
+           << " CPU: " << setw( 8 ) << this -> getCPUTime()
+           << " ELA: " << setw( 8 ) << this -> getRealTime();
+       /*double flops = ( double ) tnl_flops_counter. getFlops();
+       if( flops )
+       {
+         cout << " GFLOPS:  " << setw( 8 ) << 1.0e-9 * flops / rt_timer -> GetTime();
+       }*/
+       cout << "   \r" << flush;
+    }
+   this -> refreshing ++;
+}
+
+template< typename RealType, typename IndexType >
+void tnlODESolverMonitor< RealType, IndexType> :: setTimeStep( const RealType& timeStep )
+{
+   this -> timeStep = timeStep;
+}
+
+template< typename RealType, typename IndexType >
+const RealType& tnlODESolverMonitor< RealType, IndexType> :: getTimeStep() const
+{
+   return this -> timeStep;
+}
+
+template< typename RealType, typename IndexType >
+void tnlODESolverMonitor< RealType, IndexType> :: setTime( const RealType& time )
+{
+   this -> time = time;
+}
+
+template< typename RealType, typename IndexType >
+const RealType& tnlODESolverMonitor< RealType, IndexType> :: getTime() const
+{
+   return this -> time;
+}
+
+#endif /* TNLODESOLVERMONITOR_IMPL_H_ */
diff --git a/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h b/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h
new file mode 100644
index 0000000000000000000000000000000000000000..1854e56eba2d03807b8958ea234f54569ae0da93
--- /dev/null
+++ b/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h
@@ -0,0 +1,95 @@
+/***************************************************************************
+                          tnlIterativeSolverMonitor_impl.h  -  description
+                             -------------------
+    begin                : Oct 19, 2012
+    copyright            : (C) 2012 by Tomas Oberhuber
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLITERATIVESOLVERMONITOR_IMPL_H_
+#define TNLITERATIVESOLVERMONITOR_IMPL_H_
+
+template< typename Real, typename Index>
+tnlIterativeSolverMonitor< Real, Index > :: tnlIterativeSolverMonitor()
+: iterations( 0 ),
+  residue( 0 ),
+  refreshing( 0 ),
+  outputPeriod( 1 ),
+  verbose( 1 )
+{
+}
+
+template< typename Real, typename Index>
+void tnlIterativeSolverMonitor< Real, Index > :: setIterations( const Index& iterations )
+{
+   this -> iterations = iterations;
+}
+
+template< typename Real, typename Index>
+const Index& tnlIterativeSolverMonitor< Real, Index > :: getIterations() const
+{
+   return this -> iterations;
+}
+
+template< typename Real, typename Index>
+void tnlIterativeSolverMonitor< Real, Index > :: setResidue( const Real& residue )
+{
+   this -> residue = residue;
+}
+
+template< typename Real, typename Index>
+const Real& tnlIterativeSolverMonitor< Real, Index > :: getResidue() const
+{
+   return this -> residue;
+}
+
+template< typename Real, typename Index>
+void tnlIterativeSolverMonitor< Real, Index > :: setVerbose( const Index& verbose )
+{
+   this -> verbose = verbose;
+}
+
+template< typename Real, typename Index>
+void tnlIterativeSolverMonitor< Real, Index > :: refresh()
+{
+   if( this -> verbose > 0 && this -> refreshing % this -> outputPeriod == 0 )
+   {
+      cout << " ITER:" << setw( 8 ) << this -> getIterations()
+           << " RES:" << setprecision( 5 ) << setw( 12 ) << this -> getResidue()
+           << " CPU: " << setw( 8 ) << this -> getCPUTime()
+           << " ELA: " << setw( 8 ) << this -> getRealTime()
+           << "   \r" << flush;
+   }
+   this -> refreshing ++;
+}
+
+template< typename Real, typename Index>
+void tnlIterativeSolverMonitor< Real, Index > :: resetTimers()
+{
+   cpuTimer. Reset();
+   rtTimer. Reset();
+}
+
+template< typename Real, typename Index>
+double tnlIterativeSolverMonitor< Real, Index > :: getCPUTime()
+{
+   return cpuTimer. GetTime();
+}
+
+template< typename Real, typename Index>
+double tnlIterativeSolverMonitor< Real, Index > :: getRealTime()
+{
+   return rtTimer. GetTime();
+}
+
+
+#endif /* TNLITERATIVESOLVERMONITOR_IMPL_H_ */
diff --git a/src/implementation/solvers/tnlSolverStarter_impl.h b/src/implementation/solvers/tnlSolverStarter_impl.h
index 093655c69476fe899f47471a0d99f3c66f3c9d2b..1622d4793094756998ef9819938532e24712eaeb 100644
--- a/src/implementation/solvers/tnlSolverStarter_impl.h
+++ b/src/implementation/solvers/tnlSolverStarter_impl.h
@@ -30,6 +30,8 @@
 #include <solvers/linear/krylov/tnlGMRESSolver.h>
 #include <solvers/pde/tnlExplicitTimeStepper.h>
 #include <solvers/pde/tnlPDESolver.h>
+#include <solvers/tnlIterativeSolverMonitor.h>
+#include <solvers/ode/tnlODESolverMonitor.h>
 
 tnlSolverStarter :: tnlSolverStarter()
 : logWidth( 72 )
@@ -40,11 +42,20 @@ template< typename Problem >
 bool tnlSolverStarter :: run( const tnlParameterContainer& parameters )
 {
    this -> verbose = parameters. GetParameter< int >( "verbose" );
-   return setDiscreteSolver< Problem >( parameters );
+
+   /****
+    * Create and set-up the problem
+    */
+   Problem problem;
+   if( ! problem. init( parameters ) )
+      return false;
+
+   return setDiscreteSolver< Problem >( problem, parameters );
 }
 
 template< typename Problem >
-bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& parameters )
+bool tnlSolverStarter :: setDiscreteSolver( Problem& problem,
+                                            const tnlParameterContainer& parameters )
 {
    const tnlString& discreteSolver = parameters. GetParameter< tnlString>( "discrete-solver" );
    const tnlString& timeDiscretisation = parameters. GetParameter< tnlString>( "time-discretisation" );
@@ -65,13 +76,20 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       return false;
    }
 
+
+
    if( discreteSolver == "euler" )
    {
       typedef tnlEulerSolver< Problem > DiscreteSolver;
       DiscreteSolver solver;
       solver. setName( "euler-solver" );
       solver. setVerbose( this -> verbose );
-      return setExplicitTimeDiscretisation( parameters, solver );
+      tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType > odeSolverMonitor;
+      if( ! problem. getSolverMonitor() )
+         solver. setSolverMonitor( odeSolverMonitor );
+      else
+         solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() );
+      return setExplicitTimeDiscretisation( problem, parameters, solver );
    }
 
    if( discreteSolver == "merson" )
@@ -82,7 +100,13 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       solver. setName( "merson-solver" );
       solver. setAdaptivity( adaptivity );
       solver. setVerbose( this -> verbose );
-      return setExplicitTimeDiscretisation( parameters, solver );
+      tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType > odeSolverMonitor;
+      if( ! problem. getSolverMonitor() )
+         solver. setSolverMonitor( odeSolverMonitor );
+      else
+         solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() );
+
+      return setExplicitTimeDiscretisation( problem, parameters, solver );
    }
 
    if( ( discreteSolver == "sor" ||
@@ -105,7 +129,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       solver. setName( "sor-solver" );
       solver. setOmega( omega );
       //solver. setVerbose( this -> verbose );
-      return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver );
+      return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver );
    }
 
    if( discreteSolver == "cg" )
@@ -115,7 +139,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       DiscreteSolver solver;
       solver. setName( "cg-solver" );
       //solver. setVerbose( this -> verbose );
-      return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver );
+      return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver );
    }
 
    if( discreteSolver == "bicg-stab" )
@@ -125,7 +149,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       DiscreteSolver solver;
       solver. setName( "bicg-solver" );
       //solver. setVerbose( this -> verbose );
-      return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver );
+      return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver );
    }
 
    if( discreteSolver == "gmres" )
@@ -137,7 +161,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
       solver. setName( "gmres-solver" );
       solver. setRestarting( restarting );
       //solver. setVerbose( this -> verbose );
-      return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver );
+      return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver );
    }
 
    cerr << "Unknown discrete solver " << discreteSolver << "." << endl;
@@ -146,19 +170,21 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet
 
 template< typename Problem,
           template < typename > class DiscreteSolver >
-bool tnlSolverStarter :: setExplicitTimeDiscretisation( const tnlParameterContainer& parameters,
+bool tnlSolverStarter :: setExplicitTimeDiscretisation( Problem& problem,
+                                                        const tnlParameterContainer& parameters,
                                                         DiscreteSolver< Problem >& discreteSolver )
 {
    typedef tnlExplicitTimeStepper< Problem, DiscreteSolver > TimeStepperType;
    TimeStepperType timeStepper;
    timeStepper. setSolver( discreteSolver );
    timeStepper. setTau( parameters. GetParameter< double >( "initial-tau" ) );
-   return runPDESolver< Problem, TimeStepperType >( parameters, timeStepper );
+   return runPDESolver< Problem, TimeStepperType >( problem, parameters, timeStepper );
 }
 
 template< typename Problem,
           typename DiscreteSolver >
-bool tnlSolverStarter :: setSemiImplicitTimeDiscretisation( const tnlParameterContainer& parameters,
+bool tnlSolverStarter :: setSemiImplicitTimeDiscretisation( Problem& problem,
+                                                            const tnlParameterContainer& parameters,
                                                             DiscreteSolver& discreteSolver )
 {
 
@@ -199,19 +225,13 @@ bool tnlSolverStarter :: writeProlog( ostream& str,
 
 template< typename Problem,
           typename TimeStepper >
-bool tnlSolverStarter :: runPDESolver( const tnlParameterContainer& parameters,
+bool tnlSolverStarter :: runPDESolver( Problem& problem,
+                                       const tnlParameterContainer& parameters,
                                        TimeStepper& timeStepper )
 {
    this -> totalCpuTimer. Reset();
    this -> totalRtTimer. Reset();
 
-   /****
-    * Create and set-up the problem
-    */
-   Problem problem;
-   if( ! problem. init( parameters ) )
-      return false;
-
    /***
     * Set-up the initial condition
     */
diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt
index 992e604309053c35a1d83db4af70d93697c4ed34..242b76b92783603552ff488a0a8b092d0020f1bb 100755
--- a/src/solvers/CMakeLists.txt
+++ b/src/solvers/CMakeLists.txt
@@ -8,7 +8,7 @@ SET( headers tnlIterativeSolver.h
              tnlSolverStarter.h
              tnlSolverInitiator.h
              tnlSolverMonitor.h
-             tnlSimpleIterativeSolverMonitor.h
+             tnlIterativeSolverMonitor.h
    )
    
 INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/solvers )
diff --git a/src/solvers/ode/CMakeLists.txt b/src/solvers/ode/CMakeLists.txt
index 24337693976721f00fdc315d64c4552e9e43e19b..f0ff3dd35ba68e9100363de4c7d81de6181b0d93 100755
--- a/src/solvers/ode/CMakeLists.txt
+++ b/src/solvers/ode/CMakeLists.txt
@@ -1,6 +1,7 @@
 SET( headers tnlEulerSolver.h
              tnlMersonSolver.h
              tnlExplicitSolver.h
+             tnlODESolverMonitor.h
    )
    
 INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/solvers/ode )
\ No newline at end of file
diff --git a/src/solvers/ode/tnlExplicitSolver.h b/src/solvers/ode/tnlExplicitSolver.h
index a15270a6826578b6ad8b2c5fac4fe86eef846956..2e1f7321d1cf44e12d7504af4efcaa391dc818c7 100644
--- a/src/solvers/ode/tnlExplicitSolver.h
+++ b/src/solvers/ode/tnlExplicitSolver.h
@@ -23,6 +23,7 @@
 #include <core/tnlTimerRT.h>
 #include <core/tnlFlopsCounter.h>
 #include <core/tnlObject.h>
+#include <solvers/ode/tnlODESolverMonitor.h>
 
 template< class Problem >
 class tnlExplicitSolver : public tnlObject
@@ -70,13 +71,17 @@ class tnlExplicitSolver : public tnlObject
    void setTimerCPU( tnlTimerCPU* timer );
 
    void setTimerRT( tnlTimerRT* timer );
-
-   void printOut() const;
    
    virtual bool solve( DofVectorType& u ) = 0;
 
    void setTestingMode( bool testingMode );
 
+   void setRefreshRate( const IndexType& refreshRate );
+
+   void setSolverMonitor( tnlODESolverMonitor< RealType, IndexType >& solverMonitor );
+
+   void refreshSolverMonitor();
+
 protected:
     
    //! Current time of the parabolic problem.
@@ -113,6 +118,8 @@ protected:
    bool testingMode;
 
    Problem* problem;
+
+   tnlODESolverMonitor< RealType, IndexType >* solverMonitor;
 };
 
 template< class Problem >
@@ -236,29 +243,27 @@ void tnlExplicitSolver < Problem > :: setTimerRT( tnlTimerRT* timer )
 };
 
 template< class Problem >
-void tnlExplicitSolver < Problem > :: printOut() const
+void tnlExplicitSolver < Problem > :: setRefreshRate( const IndexType& refreshRate )
+{
+   this -> refreshRate = refreshRate;
+}
+
+template< class Problem >
+void tnlExplicitSolver < Problem > :: setSolverMonitor( tnlODESolverMonitor< RealType, IndexType >& solverMonitor )
+{
+   this -> solverMonitor = &solverMonitor;
+}
+
+template< class Problem >
+void tnlExplicitSolver < Problem > :: refreshSolverMonitor()
 {
-   if( verbosity > 0 )
+   if( this -> solverMonitor )
    {
-      IndexType cpu_time = 0;
-      if( cpu_timer ) cpu_time = cpu_timer -> GetTime( 0, solver_comm );
-      if( MPIGetRank() != 0 ) return;
-      // TODO: add EST
-      //cout << " EST: " << estimated;
-      cout << " ITER:" << setw( 8 ) << getIterationsNumber()
-           << " TAU:" << setprecision( 5 ) << setw( 12 ) << getTau()
-           << " T:" << setprecision( 5 ) << setw( 12 ) << getTime()
-           << " RES:" << setprecision( 5 ) << setw( 12 ) << getResidue();
-      if( cpu_timer )
-         cout << " CPU: " << setw( 8 ) << cpu_time;
-      if( rt_timer )
-         cout << " ELA: " << setw( 8 ) << rt_timer -> GetTime();
-      double flops = ( double ) tnl_flops_counter. getFlops();
-      if( flops )
-      {
-       cout << " GFLOPS:  " << setw( 8 ) << 1.0e-9 * flops / rt_timer -> GetTime();
-      }
-      cout << "   \r" << flush;
+      this -> solverMonitor -> setIterations( this -> getIterationsNumber() );
+      this -> solverMonitor -> setResidue( this -> getResidue() );
+      this -> solverMonitor -> setTimeStep( this -> getTau() );
+      this -> solverMonitor -> setTime( this -> getTime() );
+      this -> solverMonitor -> refresh();
    }
 }
 
diff --git a/src/solvers/ode/tnlODESolverMonitor.h b/src/solvers/ode/tnlODESolverMonitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..6a98b565e61e05eb6b1b6b488b656bce78d93498
--- /dev/null
+++ b/src/solvers/ode/tnlODESolverMonitor.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+                          tnlODESolverMonitor.h  -  description
+                             -------------------
+    begin                : Mar 12, 2013
+    copyright            : (C) 2013 by Tomas Oberhuber
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLODESOLVERMONITOR_H_
+#define TNLODESOLVERMONITOR_H_
+
+#include <solvers/tnlIterativeSolverMonitor.h>
+
+template< typename Real, typename Index>
+class tnlODESolverMonitor : public tnlIterativeSolverMonitor< Real, Index >
+{
+   public:
+
+   typedef Real RealType;
+   typedef Index IndexType;
+
+   tnlODESolverMonitor();
+
+   void refresh();
+
+   void setTimeStep( const RealType& timeStep );
+
+   const RealType& getTimeStep() const;
+
+   void setTime( const RealType& time );
+
+   const RealType& getTime() const;
+
+   protected:
+
+   RealType timeStep;
+
+   RealType time;
+
+};
+
+#include <implementation/solvers/ode/tnlODESolverMonitor_impl.h>
+
+#endif /* TNLODESOLVERMONITOR_H_ */
diff --git a/src/solvers/pde/tnlExplicitTimeStepper.h b/src/solvers/pde/tnlExplicitTimeStepper.h
index f15e3fcc32e2edbbba9d7951ebf0656097e63f13..772b8916d024c82af00d9d090fe678c52349c7ba 100644
--- a/src/solvers/pde/tnlExplicitTimeStepper.h
+++ b/src/solvers/pde/tnlExplicitTimeStepper.h
@@ -18,6 +18,8 @@
 #ifndef TNLEXPLICITTIMESTEPPER_H_
 #define TNLEXPLICITTIMESTEPPER_H_
 
+#include <solvers/ode/tnlODESolverMonitor.h>
+
 template< typename Problem,
           template < typename OdeProblem > class OdeSolver >
 class tnlExplicitTimeStepper
diff --git a/src/solvers/pde/tnlPDESolver.h b/src/solvers/pde/tnlPDESolver.h
index 82473b4be5492c0363f6c58b29e300fb363b4b45..9d16d2f213da606881b2eb990db4e8432905e67e 100644
--- a/src/solvers/pde/tnlPDESolver.h
+++ b/src/solvers/pde/tnlPDESolver.h
@@ -19,6 +19,7 @@
 #define TNLPDESOLVER_H_
 
 #include <core/tnlObject.h>
+#include <solvers/tnlSolverMonitor.h>
 
 template< typename Problem,
           typename TimeStepper >
diff --git a/src/solvers/tnlIterativeSolver.h b/src/solvers/tnlIterativeSolver.h
index a6e2f3daf6e1dc2d6e3f7218751a7b4135c0750f..e768fb427153ea7f523155a21694b09be9e9c701 100644
--- a/src/solvers/tnlIterativeSolver.h
+++ b/src/solvers/tnlIterativeSolver.h
@@ -171,13 +171,18 @@ template< typename Real, typename Index >
 void tnlIterativeSolver< Real, Index> :: setSolverMonitor( tnlSolverMonitor< Real, Index >& solverMonitor )
 {
    this -> solverMonitor = &solverMonitor;
+   solverMonitor. setSolver( this );
 }
 
 template< typename Real, typename Index >
 void tnlIterativeSolver< Real, Index> :: refreshSolverMonitor()
 {
    if( this -> solverMonitor )
+   {
+      this -> solverMonitor() -> setIterations( this -> getIterations() );
+      this -> solverMonitor() -> setResidue( this -> getResidue() );
       this -> solverMonitor -> refresh();
+   }
 }
 
 #endif /* TNLITERATIVESOLVER_H_ */
diff --git a/src/solvers/tnlIterativeSolverMonitor.h b/src/solvers/tnlIterativeSolverMonitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..f604177d953029ca97edf8557dadf409ae301214
--- /dev/null
+++ b/src/solvers/tnlIterativeSolverMonitor.h
@@ -0,0 +1,73 @@
+/***************************************************************************
+                          tnlIterativeSolverMonitor.h  -  description
+                             -------------------
+    begin                : Oct 19, 2012
+    copyright            : (C) 2012 by Tomas Oberhuber
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLITERATIVESOLVERMONITOR_H_
+#define TNLITERATIVESOLVERMONITOR_H_
+
+#include <solvers/tnlSolverMonitor.h>
+#include <solvers/tnlIterativeSolver.h>
+#include <core/tnlTimerCPU.h>
+#include <core/tnlTimerRT.h>
+
+template< typename Real, typename Index>
+class tnlIterativeSolverMonitor : public tnlSolverMonitor< Real, Index >
+{
+   public:
+
+   typedef Index IndexType;
+   typedef Real RealType;
+
+   tnlIterativeSolverMonitor();
+
+   void setIterations( const IndexType& iterations );
+
+   const IndexType& getIterations() const;
+
+   void setResidue( const RealType& residue );
+
+   const RealType& getResidue() const;
+
+   void setVerbose( const Index& verbose );
+
+   virtual void refresh();
+
+   void resetTimers();
+
+   double getCPUTime();
+
+   double getRealTime();
+
+   protected:
+
+   IndexType iterations;
+
+   RealType residue;
+
+   IndexType refreshing;
+
+   IndexType outputPeriod;
+
+   IndexType verbose;
+
+   tnlTimerCPU cpuTimer;
+
+   tnlTimerRT rtTimer;
+};
+
+#include <implementation/solvers/tnlIterativeSolverMonitor_impl.h>
+
+#endif /* TNLITERATIVESOLVERMONITOR_H_ */
diff --git a/src/solvers/tnlSimpleIterativeSolverMonitor.h b/src/solvers/tnlSimpleIterativeSolverMonitor.h
deleted file mode 100644
index d81914300d8ff1cd35663ed5647ba905901b52be..0000000000000000000000000000000000000000
--- a/src/solvers/tnlSimpleIterativeSolverMonitor.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/***************************************************************************
-                          tnlSimpleIterativeSolverMonitor.h  -  description
-                             -------------------
-    begin                : Oct 19, 2012
-    copyright            : (C) 2012 by Tomas Oberhuber
-    email                : tomas.oberhuber@fjfi.cvut.cz
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- ***************************************************************************/
-
-#ifndef TNLSIMPLEITERATIVESOLVERMONITOR_H_
-#define TNLSIMPLEITERATIVESOLVERMONITOR_H_
-
-#include <solvers/tnlSolverMonitor.h>
-#include <solvers/tnlIterativeSolver.h>
-#include <core/tnlTimerCPU.h>
-#include <core/tnlTimerRT.h>
-
-template< typename Real, typename Index>
-class tnlSimpleIterativeSolverMonitor : public tnlSolverMonitor< Real, Index >
-{
-   public:
-
-   tnlSimpleIterativeSolverMonitor();
-
-   void setSolver( const tnlIterativeSolver< Real, Index >& solver );
-
-   void setVerbose( const Index& verbose );
-
-   void refresh();
-
-   void resetTimers();
-
-   double getCPUTime();
-
-   double getRealTime();
-
-   protected:
-
-   Index refreshing;
-
-   Index outputPeriod;
-
-   Index verbose;
-
-   const tnlIterativeSolver< Real, Index >* solver;
-
-   tnlTimerCPU cpuTimer;
-
-   tnlTimerRT rtTimer;
-};
-
-template< typename Real, typename Index>
-tnlSimpleIterativeSolverMonitor< Real, Index > :: tnlSimpleIterativeSolverMonitor()
-: refreshing( 0 ),
-  outputPeriod( 1 ),
-  verbose( 1 ),
-  solver( 0 )
-{
-}
-
-template< typename Real, typename Index>
-void tnlSimpleIterativeSolverMonitor< Real, Index > :: setSolver( const tnlIterativeSolver< Real, Index >& solver )
-{
-   this -> solver = &solver;
-}
-
-template< typename Real, typename Index>
-void tnlSimpleIterativeSolverMonitor< Real, Index > :: setVerbose( const Index& verbose )
-{
-   this -> verbose = &verbose;
-}
-
-template< typename Real, typename Index>
-void tnlSimpleIterativeSolverMonitor< Real, Index > :: refresh()
-{
-   if( ! solver )
-      return;
-   this -> refreshing ++;
-   if( this -> verbose > 0 )
-   {
-      cout << " ITER:" << setw( 8 ) << solver -> getIterations()
-           << " RES:" << setprecision( 5 ) << setw( 12 ) << solver -> getResidue()
-           << " CPU: " << setw( 8 ) << this -> getCPUTime()
-           << " ELA: " << setw( 8 ) << this -> getRealTime()
-           << "   \r" << flush;
-   }
-}
-
-template< typename Real, typename Index>
-void tnlSimpleIterativeSolverMonitor< Real, Index > :: resetTimers()
-{
-   cpuTimer. Reset();
-   rtTimer. Reset();
-}
-
-template< typename Real, typename Index>
-double tnlSimpleIterativeSolverMonitor< Real, Index > :: getCPUTime()
-{
-   return cpuTimer. GetTime();
-}
-
-template< typename Real, typename Index>
-double tnlSimpleIterativeSolverMonitor< Real, Index > :: getRealTime()
-{
-   return rtTimer. GetTime();
-}
-
-
-#endif /* TNLSIMPLEITERATIVESOLVERMONITOR_H_ */
diff --git a/src/solvers/tnlSolverStarter.h b/src/solvers/tnlSolverStarter.h
index daf60027a25c5f16a9836223beab91741d6af2db..477fc166c87ecd4e96f9f1be0b63676df81f7344 100644
--- a/src/solvers/tnlSolverStarter.h
+++ b/src/solvers/tnlSolverStarter.h
@@ -33,16 +33,19 @@ class tnlSolverStarter
    bool run( const tnlParameterContainer& parameters );
 
    template< typename Problem >
-   bool setDiscreteSolver( const tnlParameterContainer& parameters );
+   bool setDiscreteSolver( Problem& problem,
+                           const tnlParameterContainer& parameters );
 
    template< typename Problem,
              template < typename > class DiscreteSolver >
-   bool setExplicitTimeDiscretisation( const tnlParameterContainer& parameters,
+   bool setExplicitTimeDiscretisation( Problem& problem,
+                                       const tnlParameterContainer& parameters,
                                        DiscreteSolver< Problem >& solver );
 
    template< typename Problem,
              typename DiscreteSolver >
-   bool setSemiImplicitTimeDiscretisation( const tnlParameterContainer& parameters,
+   bool setSemiImplicitTimeDiscretisation( Problem& problem,
+                                           const tnlParameterContainer& parameters,
                                            DiscreteSolver& solver);
 
    template< typename Problem >
@@ -51,7 +54,8 @@ class tnlSolverStarter
                      const Problem& problem );
 
    template< typename Problem, typename TimeStepper >
-   bool runPDESolver( const tnlParameterContainer& parameters,
+   bool runPDESolver( Problem& problem,
+                      const tnlParameterContainer& parameters,
                       TimeStepper& timeStepper );
 
    bool writeEpilog( ostream& str );
diff --git a/tests/benchmarks/matrix-solvers-benchmark.h b/tests/benchmarks/matrix-solvers-benchmark.h
index 44c8819e16120e5c708debaf611572c38853b7e9..7eeb9d8dec7c91a37ebf10efd2b37492b0fae25f 100644
--- a/tests/benchmarks/matrix-solvers-benchmark.h
+++ b/tests/benchmarks/matrix-solvers-benchmark.h
@@ -24,7 +24,7 @@
 #include <config/tnlConfigDescription.h>
 #include <config/tnlParameterContainer.h>
 #include <matrix/tnlCSRMatrix.h>
-#include <solvers/tnlSimpleIterativeSolverMonitor.h>
+#include <solvers/tnlIterativeSolverMonitor.h>
 #include <solvers/linear/stationary/tnlSORSolver.h>
 #include <solvers/linear/krylov/tnlCGSolver.h>
 #include <solvers/linear/krylov/tnlBICGStabSolver.h>
@@ -79,8 +79,7 @@ bool benchmarkSolver( const tnlParameterContainer&  parameters,
    solver. setMaxIterations( maxIterations );
    solver. setMaxResidue( maxResidue );
    solver. setMinResidue( 1.0e9 );
-   tnlSimpleIterativeSolverMonitor< RealType, IndexType > solverMonitor;
-   solverMonitor. setSolver( solver );
+   tnlIterativeSolverMonitor< RealType, IndexType > solverMonitor;
    solver. setSolverMonitor( solverMonitor );
    solver. setRefreshRate( 10 );
    solverMonitor. resetTimers();