diff --git a/Plugin/AnalyseCurvedMesh.cpp b/Plugin/AnalyseCurvedMesh.cpp
index a1fe8430691cfe13bcafa709ae29311b9d66cff5..372e9a1e9b7944941edf43075f1be26352cc82eb 100644
--- a/Plugin/AnalyseCurvedMesh.cpp
+++ b/Plugin/AnalyseCurvedMesh.cpp
@@ -22,6 +22,39 @@
 
 class bezierBasis;
 
+ProgressStatus::ProgressStatus(int num)
+        : totalElementToTreat_(num), currentI_(0), nextIToCheck_(0),
+          initialTime_(Cpu()), lastTime_(initialTime_), lastPercentage_(0)
+{}
+
+void ProgressStatus::check()
+{
+  ++currentI_;
+  if (currentI_ < nextIToCheck_) return;
+
+  unsigned int currentPercentage = currentI_*100/totalElementToTreat_;
+  nextIToCheck_ = (currentPercentage+1) * totalElementToTreat_ / 100 + 1;
+  //nextIToCheck_ += totalElementToTreat_ / 100;
+
+  double currentTime = Cpu();
+  if ((currentPercentage < 5                   && currentTime - lastTime_ > 15.) ||
+      (currentPercentage > lastPercentage_ + 4 && currentTime - lastTime_ > 10.)) {
+    lastPercentage_ = currentPercentage;
+    lastTime_ = currentTime;
+    const double remaining = (currentTime-initialTime_) / (currentI_+1) *
+                             (totalElementToTreat_ - currentI_-1);
+    if (remaining < 60*2)
+      Msg::StatusBar(true, "%d%% (remaining time ~%g seconds)",
+                     currentPercentage, remaining);
+    else if (remaining < 60*60*2)
+      Msg::StatusBar(true, "%d%% (remaining time ~%g minutes)",
+                     currentPercentage, remaining/60);
+    else
+      Msg::StatusBar(true, "%d%% (remaining time ~%g hours)",
+                     currentPercentage, remaining/3600);
+  }
+}
+
 StringXNumber CurvedMeshOptions_Number[] = {
   {GMSH_FULLRC, "Jacobian determinant", NULL, 1},
   {GMSH_FULLRC, "Scaled Jacobian", NULL, 0},
@@ -322,8 +355,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim)
       default: break;
     }
 
-    double initial, time = initial = Cpu();
-    unsigned int percentage = 0, nextCheck = 0;
+    ProgressStatus progress(num);
 
     _data.reserve(_data.size()+num);
     for (unsigned i = 0; i < num; ++i) {
@@ -334,27 +366,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim)
       if (min < 0 && max < 0) {
         Msg::Warning("Element %d is completely inverted", el->getNum());
       }
-
-      if (i >= nextCheck) {
-        nextCheck += num / 100;
-        double curTime = Cpu();
-        unsigned int curPercentage = i*100/num;
-        if ((curTime - time > 10. && curPercentage > percentage + 4) ||
-            (curTime - time > 15. && curPercentage < 5)) {
-          percentage = curPercentage;
-          time = curTime;
-          const double remaining = (time-initial) / (i+1) * (num - i-1);
-          if (remaining < 60*2)
-            Msg::StatusBar(true, "%d%% (remaining time ~%g seconds)",
-                percentage, remaining);
-          else if (remaining < 60*60*2)
-            Msg::StatusBar(true, "%d%% (remaining time ~%g minutes)",
-                percentage, remaining/60);
-          else
-            Msg::StatusBar(true, "%d%% (remaining time ~%g hours)",
-                percentage, remaining/3600);
-        }
-      }
+      progress.check();
     }
     delete normals;
   }
@@ -365,8 +377,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinScaledJac(int dim)
 {
   if (_computedS[dim-1]) return;
 
-  double initial, time = initial = Cpu();
-  unsigned int percentage = 0, nextCheck = 0;
+  ProgressStatus progress(_data.size());
 
   for (unsigned int i = 0; i < _data.size(); ++i) {
     MElement *const el = _data[i].element();
@@ -377,26 +388,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinScaledJac(int dim)
     else {
       _data[i].setMinS(jacobianBasedQuality::minScaledJacobian(el, true));
     }
-    if (i >= nextCheck) {
-      nextCheck += _data.size() / 100;
-      double curTime = Cpu();
-      unsigned int curPercentage = i*100/_data.size();
-      if ((curTime - time > 10. && curPercentage > percentage + 4) ||
-          (curTime - time > 15. && curPercentage < 5)) {
-        percentage = curPercentage;
-        time = curTime;
-        const double remaining = (time-initial) / (i+1) * (_data.size() - i-1);
-        if (remaining < 60*2)
-          Msg::StatusBar(true, "%d%% (remaining time ~%g seconds)",
-              percentage, remaining);
-        else if (remaining < 60*60*2)
-          Msg::StatusBar(true, "%d%% (remaining time ~%g minutes)",
-              percentage, remaining/60);
-        else
-          Msg::StatusBar(true, "%d%% (remaining time ~%g hours)",
-              percentage, remaining/3600);
-      }
-    }
+    progress.check();
   }
 
   _computedS[dim-1] = true;
@@ -406,8 +398,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinIsotropy(int dim)
 {
   if (_computedI[dim-1]) return;
 
-  double initial, time = initial = Cpu();
-  unsigned int percentage = 0, nextCheck = 0;
+  ProgressStatus progress(_data.size());
 
   for (unsigned int i = 0; i < _data.size(); ++i) {
     MElement *const el = _data[i].element();
@@ -418,26 +409,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinIsotropy(int dim)
     else {
       _data[i].setMinI(jacobianBasedQuality::minIsotropyMeasure(el, true));
     }
-    if (i >= nextCheck) {
-      nextCheck += _data.size() / 100;
-      double curTime = Cpu();
-      unsigned int curPercentage = i*100/_data.size();
-      if ((curTime - time > 10. && curPercentage > percentage + 4) ||
-          (curTime - time > 15. && curPercentage < 5)) {
-        percentage = curPercentage;
-        time = curTime;
-        const double remaining = (time-initial) / (i+1) * (_data.size() - i-1);
-        if (remaining < 60*2)
-          Msg::StatusBar(true, "%d%% (remaining time ~%g seconds)",
-              percentage, remaining);
-        else if (remaining < 60*60*2)
-          Msg::StatusBar(true, "%d%% (remaining time ~%g minutes)",
-              percentage, remaining/60);
-        else
-          Msg::StatusBar(true, "%d%% (remaining time ~%g hours)",
-              percentage, remaining/3600);
-      }
-    }
+    progress.check();
   }
 
   _computedI[dim-1] = true;
diff --git a/Plugin/AnalyseCurvedMesh.h b/Plugin/AnalyseCurvedMesh.h
index 17aa641503509de110cc41d4c77580666cfcd786..f7abb42d8b7ae60842b944c0dff29594c2f7bbaa 100644
--- a/Plugin/AnalyseCurvedMesh.h
+++ b/Plugin/AnalyseCurvedMesh.h
@@ -36,6 +36,18 @@ public:
   double minI() { return _minI; }
 };
 
+class ProgressStatus
+{
+private:
+  int totalElementToTreat_, currentI_, nextIToCheck_;
+  double initialTime_, lastTime_;
+  int lastPercentage_;
+public:
+  ProgressStatus(int num);
+  void setInitialTime(double time) {initialTime_ = time;}
+  void check();
+};
+
 class GMSH_AnalyseCurvedMeshPlugin : public GMSH_PostPlugin
 {
 private :