Index: /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.cpp
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.cpp	(revision 1356)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.cpp	(revision 1357)
@@ -9,4 +9,5 @@
       CCalendar::CCalendar(void)
          : CObject()
+         , step(0)
          , initDate(*this)
          , timeOrigin(*this)
@@ -16,4 +17,5 @@
       CCalendar::CCalendar(const StdString& id)
                : CObject(id)
+               , step(0)
                , initDate(*this)
                , timeOrigin(*this)
@@ -25,4 +27,5 @@
                            int hr /*= 0*/, int min /*= 0*/, int sec /*= 0*/)
                : CObject(id)
+               , step(0)
                , initDate(*this)
                , timeOrigin(*this)
@@ -34,4 +37,5 @@
       CCalendar::CCalendar(const StdString& id, const CDate& startDate)
                : CObject(id)
+               , step(0)
                , initDate(startDate)
                , timeOrigin(startDate)
@@ -44,4 +48,5 @@
       CCalendar::CCalendar(const StdString& id, const CDate& startDate, const CDate& timeOrigin)
                : CObject(id)
+               , step(0)
                , initDate(startDate)
                , timeOrigin(timeOrigin)
@@ -115,7 +120,13 @@
       }
 
+      int CCalendar::getStep(void) const
+      {
+        return step;
+      }
+
       const CDate& CCalendar::update(int step)
       {
         info(20) << "update step : " << step << " timestep " << this->timestep << std::endl;
+        this->step = step;
         return (this->currentDate = this->getInitDate() + step * this->timestep);
       }
Index: /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.hpp
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.hpp	(revision 1356)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/calendar.hpp	(revision 1357)
@@ -70,4 +70,6 @@
             virtual StdString getType(void) const;
 
+            int getStep(void) const;
+
             virtual int getMonthLength(const CDate& date) const;
 
@@ -112,4 +114,5 @@
 
          private :
+            int step;
 
             /// PropriÃ©tÃ©s privÃ©es ///
Index: /XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp	(revision 1356)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp	(revision 1357)
@@ -1833,16 +1833,26 @@
    void CContext::updateCalendar(int step)
    {
-      info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;
-      calendar->update(step);
-      info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;
-#ifdef XIOS_MEMTRACK_LIGHT
-      info(50) << " Current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;
-#endif
-      //if (hasClient) 
-      if (hasClient && !hasServer) // For now we only use server level 1 to read data
+      int prevStep = calendar->getStep();
+
+      if (prevStep < step)
       {
-        doPostTimestepOperationsForEnabledReadModeFiles();
-        garbageCollector.invalidate(calendar->getCurrentDate());
+        info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;
+        calendar->update(step);
+        info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;
+  #ifdef XIOS_MEMTRACK_LIGHT
+        info(50) << " Current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;
+  #endif
+
+        if (hasClient && !hasServer) // For now we only use server level 1 to read data
+        {
+          doPostTimestepOperationsForEnabledReadModeFiles();
+          garbageCollector.invalidate(calendar->getCurrentDate());
+        }
       }
+      else if (prevStep == step)
+        info(50) << "updateCalendar: already at step " << step << ", no operation done." << endl;
+      else // if (prevStep > step)
+        ERROR("void CContext::updateCalendar(int step)",
+              << "Illegal calendar update: previous step was " << prevStep << ", new step " << step << "is in the past!")
    }
 
Index: /XIOS/trunk/src/calendar.cpp
===================================================================
--- /XIOS/trunk/src/calendar.cpp	(revision 1356)
+++ /XIOS/trunk/src/calendar.cpp	(revision 1357)
@@ -9,4 +9,5 @@
       CCalendar::CCalendar(void)
          : CObject()
+         , step(0)
          , initDate(*this)
          , timeOrigin(*this)
@@ -16,4 +17,5 @@
       CCalendar::CCalendar(const StdString& id)
                : CObject(id)
+               , step(0)
                , initDate(*this)
                , timeOrigin(*this)
@@ -25,4 +27,5 @@
                            int hr /*= 0*/, int min /*= 0*/, int sec /*= 0*/)
                : CObject(id)
+               , step(0)
                , initDate(*this)
                , timeOrigin(*this)
@@ -34,4 +37,5 @@
       CCalendar::CCalendar(const StdString& id, const CDate& startDate)
                : CObject(id)
+               , step(0)
                , initDate(startDate)
                , timeOrigin(startDate)
@@ -44,4 +48,5 @@
       CCalendar::CCalendar(const StdString& id, const CDate& startDate, const CDate& timeOrigin)
                : CObject(id)
+               , step(0)
                , initDate(startDate)
                , timeOrigin(timeOrigin)
@@ -115,7 +120,13 @@
       }
 
+      int CCalendar::getStep(void) const
+      {
+        return step;
+      }
+
       const CDate& CCalendar::update(int step)
       {
         info(20) << "update step : " << step << " timestep " << this->timestep << std::endl;
+        this->step = step;
         return (this->currentDate = this->getInitDate() + step * this->timestep);
       }
Index: /XIOS/trunk/src/calendar.hpp
===================================================================
--- /XIOS/trunk/src/calendar.hpp	(revision 1356)
+++ /XIOS/trunk/src/calendar.hpp	(revision 1357)
@@ -70,4 +70,6 @@
             virtual StdString getType(void) const;
 
+            int getStep(void) const;
+
             virtual int getMonthLength(const CDate& date) const;
 
@@ -112,4 +114,5 @@
 
          private :
+            int step;
 
             /// PropriÃ©tÃ©s privÃ©es ///
Index: /XIOS/trunk/src/node/context.cpp
===================================================================
--- /XIOS/trunk/src/node/context.cpp	(revision 1356)
+++ /XIOS/trunk/src/node/context.cpp	(revision 1357)
@@ -1202,15 +1202,26 @@
    void CContext::updateCalendar(int step)
    {
-      info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;
-      calendar->update(step);
-      info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;
-#ifdef XIOS_MEMTRACK_LIGHT
-      info(50) << " Current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;
-#endif
-      if (hasClient)
+      int prevStep = calendar->getStep();
+
+      if (prevStep < step)
       {
-        doPostTimestepOperationsForEnabledReadModeFiles();
-        garbageCollector.invalidate(calendar->getCurrentDate());
+        info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;
+        calendar->update(step);
+        info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;
+  #ifdef XIOS_MEMTRACK_LIGHT
+        info(50) << " Current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;
+  #endif
+
+        if (hasClient)
+        {
+          doPostTimestepOperationsForEnabledReadModeFiles();
+          garbageCollector.invalidate(calendar->getCurrentDate());
+        }
       }
+      else if (prevStep == step)
+        info(50) << "updateCalendar: already at step " << step << ", no operation done." << endl;
+      else // if (prevStep > step)
+        ERROR("void CContext::updateCalendar(int step)",
+              << "Illegal calendar update: previous step was " << prevStep << ", new step " << step << "is in the past!")
    }
 
