diff --git a/Examples/testPenalization.py b/Examples/testPenalization.py
index 7aebc86126e0b1302fa91e8a9f4bebad59b27985..192becbff17e797cce928260a0b70c7570ec9608 100644
--- a/Examples/testPenalization.py
+++ b/Examples/testPenalization.py
@@ -8,6 +8,7 @@ from parmepy.domain.obstacle.plates import Plates
 pi = math.pi
 from parmepy.operator.penalization import Penalization
 from parmepy.operator.monitors.printer import Printer
+from parmepy.problem.simulation import Simulation
 
 
 def vitesse(x, y, z):
@@ -67,9 +68,9 @@ penal2.setUp()
 printer = Printer(fields=[scal2], frequency=1)
 printer.setUp()
 print scal.norm()
-
-penal.apply(dt=0.1)
-penal2.apply(dt=0.1)
-printer.apply(ite=1)
+simulation = Simulation()
+penal.apply(simulation)
+penal2.apply(simulation)
+printer.apply(simulation)
 print "print ..."
 print scal.norm()
diff --git a/HySoP/hysop/operator/discrete/analytic.py b/HySoP/hysop/operator/discrete/analytic.py
index 80fcc6d7a65b8a717e199c1eacca98196f210ed4..f8508720f995e8b90b5c26515fd69f05747b4a8b 100644
--- a/HySoP/hysop/operator/discrete/analytic.py
+++ b/HySoP/hysop/operator/discrete/analytic.py
@@ -35,6 +35,9 @@ class Analytic_D(DiscreteOperator):
         Initialize is always called with coords + current time.
         Any extra parameters must be set using field.setExtraParameters.
         """
+        if simulation is None:
+            raise ValueError("Missing simulation value for computation.")
+
         self.compute_time = MPI.Wtime()
         for df in self.variables:
             df.initialize(self.vformula, simulation.time)
diff --git a/HySoP/hysop/operator/discrete/curlAndDiffusion_fft.py b/HySoP/hysop/operator/discrete/curlAndDiffusion_fft.py
index 6bede01e067743e32516eb3b938a16d378771d69..67fc5d496fce8cd0b1e412629ac100e877d16516 100644
--- a/HySoP/hysop/operator/discrete/curlAndDiffusion_fft.py
+++ b/HySoP/hysop/operator/discrete/curlAndDiffusion_fft.py
@@ -35,11 +35,7 @@ class DiffusionFFT(DiscreteOperator):
         self.compute_time = 0.
 
     @debug
-    def apply(self, t=None, dt=None, ite=None):
-        """
-        Apply operator.
-        """
-        self.compute_time = time.time()
+    def apply(self, simulation):
 
         if (self.vorticity.dimension == 2):
 
diff --git a/HySoP/hysop/operator/discrete/multiphase.py b/HySoP/hysop/operator/discrete/multiphase.py
index 172aaf6772e7d0e09bdf0f6ea2af48c4a3dff97e..887fca716d936cfb643ff8a1075148bc28c2ff05 100644
--- a/HySoP/hysop/operator/discrete/multiphase.py
+++ b/HySoP/hysop/operator/discrete/multiphase.py
@@ -34,7 +34,7 @@ class Pressure_d(DiscreteOperator):
     @debug
     def apply(self, simulation=None):
         if simulation is None:
-            raise ValueError("Missing dt value for diffusion computation.")
+            raise ValueError("Missing simulation value for computation.")
 
         self.compute_time = time.time()
         dt = simulation.timeStep
diff --git a/HySoP/hysop/operator/discrete/particle_advection.py b/HySoP/hysop/operator/discrete/particle_advection.py
index aa8b05b86867c657700f08e2ba516c4b843795f5..bd494c991b47800fd28021c34f957f38815ccd2d 100644
--- a/HySoP/hysop/operator/discrete/particle_advection.py
+++ b/HySoP/hysop/operator/discrete/particle_advection.py
@@ -149,7 +149,7 @@ class ParticleAdvection(DiscreteOperator):
     @debug
     def apply(self, simulation=None):
         if simulation is None:
-            raise ValueError("Missing dt value for diffusion computation.")
+            raise ValueError("Missing simulation value for computation.")
 
         self.numMethod(simulation.time, simulation.timeStep)
 
diff --git a/HySoP/hysop/operator/discrete/scales_advection.py b/HySoP/hysop/operator/discrete/scales_advection.py
index 3c4aaa9b690121ab41bc96b48ca745c5dab2717c..76ad8f0ab19d212b2ea7c6d947d522a7b6e93e1a 100644
--- a/HySoP/hysop/operator/discrete/scales_advection.py
+++ b/HySoP/hysop/operator/discrete/scales_advection.py
@@ -42,7 +42,7 @@ class ScalesAdvection(DiscreteOperator):
     @debug
     def apply(self, simulation=None):
         if simulation is None:
-            raise ValueError("Missing dt value for diffusion computation.")
+            raise ValueError("Missing simulation value for computation.")
 
         self.compute_time = time.time()
         dt = simulation.timeStep
diff --git a/HySoP/hysop/operator/discrete/stretching.py b/HySoP/hysop/operator/discrete/stretching.py
index b26a9419a48dd6a1e453aaad740601a3bee5b6bb..6fede186d6fb8daab2cbfe15edfc8199b572aa04 100755
--- a/HySoP/hysop/operator/discrete/stretching.py
+++ b/HySoP/hysop/operator/discrete/stretching.py
@@ -79,7 +79,7 @@ class Stretching_d(DiscreteOperator):
          -integrate with the chosen method (RK4. RK2. euler)
         """
         if simulation is None:
-            raise ValueError("Missing dt value for diffusion computation.")
+            raise ValueError("Missing simulation value for computation.")
 
         self.compute_time = time.time()
         dt = simulation.timeStep
diff --git a/HySoP/hysop/operator/discrete/synchronizeGhosts.py b/HySoP/hysop/operator/discrete/synchronizeGhosts.py
index 6a6b622c69d64a95a2683bdf5fc2f7d178672950..23036054c6f22ddb4004aa1ed34bcc5e13d82551 100644
--- a/HySoP/hysop/operator/discrete/synchronizeGhosts.py
+++ b/HySoP/hysop/operator/discrete/synchronizeGhosts.py
@@ -114,7 +114,7 @@ class SynchronizeGhosts_d(DiscreteOperator):
         #self.discreteOperator.setUp()
 
     @debug
-    def apply(self, t, dt, ite):
+    def apply(self, simulation=None):
         self.resolution = self.topology.localGridResolution
         resolution = self.topology.localGridResolution
         ghosts = self.topology.ghosts
diff --git a/HySoP/hysop/operator/monitors/printer.py b/HySoP/hysop/operator/monitors/printer.py
index 89ccb20e886d8f8521123b7806ff2da900f91d2a..1ca7e7f75ec4600fe297c2b0cfa597f5ad359dfe 100644
--- a/HySoP/hysop/operator/monitors/printer.py
+++ b/HySoP/hysop/operator/monitors/printer.py
@@ -7,7 +7,6 @@ from parmepy.constants import np, S_DIR, PARMES_REAL
 from parmepy.operator.monitors.monitoring import Monitoring
 import evtk.hl as evtk
 from parmepy.mpi import main_rank
-from parmepy.mpi import MPI
 
 
 class Printer(Monitoring):
@@ -30,6 +29,8 @@ class Printer(Monitoring):
         Monitoring.__init__(self, fields, frequency)
         ## output file name prefix
         self.prefix = prefix + str(main_rank)
+        ## Extension for filename
+        self.ext = ext
         ## Method to collect data in case of distributed data
         self.get_data_method = None
         if self.freq != 0:
@@ -37,13 +38,14 @@ class Printer(Monitoring):
             self.step = self._printStep
         else:
             self.step = self._passStep
-        ## Printing compute time
-        self.compute_time = 0.
         ## Internal counter
         self._call_number = 0
 
-    def apply(self, t=None, dt=None, ite=None):
-        self.step(ite)
+    def apply(self, simulation=None):
+        if simulation is None:
+            raise ValueError("Missing simulation value for monitoring.")
+
+        self.step(simulation.currentIteration)
 
     def _build_vtk_dict(self):
         """Build a dictionary from fields to VTK image."""
@@ -74,7 +76,7 @@ class Printer(Monitoring):
             raise ValueError("Cannot set non callable method to get data " +
                              "to print. Given method : " + str(method))
 
-    def _passStep(self, ite):
+    def _passStep(self, ite=None):
         """A code method that do nothing."""
         pass
 
@@ -82,8 +84,8 @@ class Printer(Monitoring):
         """
         Try to write data into VTK files.
         If fails, turn to classical ascii output.
+        @param iter : current iteration number
         """
-        t = MPI.Wtime()
         if (ite % self.freq) == 0:
             self._call_number += 1
             # Transfer from GPU to CPU if required
@@ -94,8 +96,8 @@ class Printer(Monitoring):
                     except AttributeError:
                         pass
             # Set output file name
-            filename = self.outputPrefix + "results_{0:05d}.dat".format(ite)
-            print "Print file : " + filename
+            filename = self.prefix + '_it_' + str(ite) + self.ext
+            print "Print to file " + filename
             ## VTK output \todo: Need fix in 2D, getting an IOError.
             try:
                 evtk.imageToVTK(filename, pointData=self._build_vtk_dict())
@@ -145,13 +147,6 @@ class Printer(Monitoring):
                                     f.write("\n")
                     f.close()
             print "==\n"
-        self.compute_time += (time.time() - t)
-
-    def printComputeTime(self):
-        self.time_info[0] = "\"IO\" "
-        self.time_info[1] = str(self.compute_time) + "  "
-        print "IO total time : ", self.compute_time, self._call_number
-
 
 if __name__ == "__main__":
     print __doc__