Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp	(revision 1318)
@@ -783,10 +783,10 @@
    }
 
-   void CContext::checkPrefetchingOfEnabledReadModeFiles()
+   void CContext::doPostTimestepOperationsForEnabledReadModeFiles()
    {
      int size = enabledReadModeFiles.size();
      for (int i = 0; i < size; ++i)
      {
-        enabledReadModeFiles[i]->prefetchEnabledReadModeFieldsIfNeeded();
+        enabledReadModeFiles[i]->doPostTimestepOperationsForEnabledReadModeFields();
      }
    }
@@ -1709,5 +1709,5 @@
       if (hasClient && !hasServer) // For now we only use server level 1 to read data
       {
-        checkPrefetchingOfEnabledReadModeFiles();
+        doPostTimestepOperationsForEnabledReadModeFiles();
         garbageCollector.invalidate(calendar->getCurrentDate());
       }
Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp	(revision 1318)
@@ -121,5 +121,5 @@
          void buildFilterGraphOfEnabledFields();
          void startPrefetchingOfEnabledReadModeFiles();
-         void checkPrefetchingOfEnabledReadModeFiles();
+         void doPostTimestepOperationsForEnabledReadModeFiles();
          void findFieldsWithReadAccess(void);
          void solveAllRefOfFieldsWithReadAccess();
Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp	(revision 1318)
@@ -40,4 +40,5 @@
       , hasTimeInstant(false)
       , hasTimeCentered(false)
+      , wasDataRequestedFromServer(false)
       , wasDataAlreadyReceivedFromServer(false)
       , isEOF(false), nstepMaxRead(false)
@@ -55,4 +56,5 @@
       , hasTimeInstant(false)
       , hasTimeCentered(false)
+      , wasDataRequestedFromServer(false)
       , wasDataAlreadyReceivedFromServer(false)
       , isEOF(false), nstepMaxRead(false)
@@ -291,5 +293,6 @@
     lastDataRequestedFromServer = tsDataRequested;
 
-    if (!isEOF) // No need to send the request if we already know we are at EOF
+    // No need to send the request if we are sure that we are already at EOF
+    if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF)
     {
       CEventClient event(getType(), EVENT_ID_READ_DATA);
@@ -307,4 +310,6 @@
     else
       serverSourceFilter->signalEndOfStream(tsDataRequested);
+
+    wasDataRequestedFromServer = true;
 
     return !isEOF;
@@ -520,10 +525,11 @@
   {
     CContext* context = CContext::getCurrent();
-    int record;
     std::map<int, CArray<double,1> > data;
+    const bool wasEOF = isEOF;
 
     for (int i = 0; i < ranks.size(); i++)
     {
       int rank = ranks[i];
+      int record;
       *buffers[i] >> record;
       isEOF = (record == int(-1));
@@ -544,7 +550,40 @@
 
     if (isEOF)
+    {
+      if (!wasEOF)
+        dateEOF = lastDataReceivedFromServer;
+
       serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer);
+    }
     else
       serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data);
+  }
+
+  void CField::checkForLateDataFromServer(void)
+  {
+    CContext* context = CContext::getCurrent();
+    const CDate& currentDate = context->getCalendar()->getCurrentDate();
+
+    // Check if data previously requested has been received as expected
+    if (wasDataRequestedFromServer && (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF))
+    {
+      CTimer timer("CField::checkForLateDataFromServer");
+
+      bool isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate;
+      while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout)
+      {
+        timer.resume();
+
+        context->checkBuffersAndListen();
+
+        timer.suspend();
+
+        isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate;
+      }
+
+      if (isDataLate)
+        ERROR("void CField::checkForLateDataFromServer(void)",
+              << "Late data at timestep = " << currentDate);
+    }
   }
 
Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp	(revision 1318)
@@ -172,4 +172,5 @@
         static void recvReadDataReady(CEventServer& event);
         void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers);
+        void checkForLateDataFromServer(void);
         void outputField(CArray<double,3>& fieldOut);
         void outputField(CArray<double,2>& fieldOut);
@@ -217,6 +218,6 @@
          bool isEOF;
          CDate lastlast_Write_srv, last_Write_srv, last_operation_srv;
-         CDate lastDataRequestedFromServer, lastDataReceivedFromServer;
-         bool wasDataAlreadyReceivedFromServer;
+         CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF;
+         bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer;
 
          map<int,boost::shared_ptr<func::CFunctor> > foperation_srv;
Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp	(revision 1318)
@@ -867,7 +867,9 @@
 
    /*!
-     Prefetching the data for enabled fields read from file whose data is out-of-date.
-   */
-   void CFile::prefetchEnabledReadModeFieldsIfNeeded(void)
+     Do all post timestep operations for enabled fields in read mode:
+      - Prefetch the data read from file when needed
+      - Check that the data excepted from server has been received
+   */
+   void CFile::doPostTimestepOperationsForEnabledReadModeFields(void)
    {
      if (mode.isEmpty() || mode.getValue() != mode_attr::read)
@@ -876,5 +878,8 @@
      int size = this->enabledFields.size();
      for (int i = 0; i < size; ++i)
+     {
+       this->enabledFields[i]->checkForLateDataFromServer();
        this->enabledFields[i]->sendReadDataRequestIfNeeded();
+     }
    }
 
Index: XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp	(revision 1317)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp	(revision 1318)
@@ -111,5 +111,5 @@
          void buildFilterGraphOfEnabledFields(CGarbageCollector& gc);
          void prefetchEnabledReadModeFields();
-         void prefetchEnabledReadModeFieldsIfNeeded();
+         void doPostTimestepOperationsForEnabledReadModeFields();
 
          void solveAllRefOfEnabledFieldsAndTransform(bool sendToServer);
Index: XIOS/trunk/src/node/context.cpp
===================================================================
--- XIOS/trunk/src/node/context.cpp	(revision 1317)
+++ XIOS/trunk/src/node/context.cpp	(revision 1318)
@@ -514,10 +514,10 @@
    }
 
-   void CContext::checkPrefetchingOfEnabledReadModeFiles()
+   void CContext::doPostTimestepOperationsForEnabledReadModeFiles()
    {
      int size = enabledReadModeFiles.size();
      for (int i = 0; i < size; ++i)
      {
-        enabledReadModeFiles[i]->prefetchEnabledReadModeFieldsIfNeeded();
+        enabledReadModeFiles[i]->doPostTimestepOperationsForEnabledReadModeFields();
      }
    }
@@ -1210,5 +1210,5 @@
       if (hasClient)
       {
-        checkPrefetchingOfEnabledReadModeFiles();
+        doPostTimestepOperationsForEnabledReadModeFiles();
         garbageCollector.invalidate(calendar->getCurrentDate());
       }
Index: XIOS/trunk/src/node/context.hpp
===================================================================
--- XIOS/trunk/src/node/context.hpp	(revision 1317)
+++ XIOS/trunk/src/node/context.hpp	(revision 1318)
@@ -115,5 +115,5 @@
          void buildFilterGraphOfEnabledFields();
          void startPrefetchingOfEnabledReadModeFiles();
-         void checkPrefetchingOfEnabledReadModeFiles();
+         void doPostTimestepOperationsForEnabledReadModeFiles();
          void findFieldsWithReadAccess(void);
          void solveAllRefOfFieldsWithReadAccess();
Index: XIOS/trunk/src/node/field.cpp
===================================================================
--- XIOS/trunk/src/node/field.cpp	(revision 1317)
+++ XIOS/trunk/src/node/field.cpp	(revision 1318)
@@ -38,4 +38,5 @@
       , hasTimeInstant(false)
       , hasTimeCentered(false)
+      , wasDataRequestedFromServer(false)
       , wasDataAlreadyReceivedFromServer(false)
       , isEOF(false)
@@ -52,4 +53,5 @@
       , hasTimeInstant(false)
       , hasTimeCentered(false)
+      , wasDataRequestedFromServer(false)
       , wasDataAlreadyReceivedFromServer(false)
       , isEOF(false)
@@ -261,5 +263,6 @@
     lastDataRequestedFromServer = tsDataRequested;
 
-    if (!isEOF) // No need to send the request if we already know we are at EOF
+    // No need to send the request if we are sure that we are already at EOF
+    if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF)
     {
       CEventClient event(getType(), EVENT_ID_READ_DATA);
@@ -277,4 +280,6 @@
     else
       serverSourceFilter->signalEndOfStream(tsDataRequested);
+
+    wasDataRequestedFromServer = true;
 
     return !isEOF;
@@ -433,10 +438,11 @@
   {
     CContext* context = CContext::getCurrent();
-    int record;
     std::map<int, CArray<double,1> > data;
+    const bool wasEOF = isEOF;
 
     for (int i = 0; i < ranks.size(); i++)
     {
       int rank = ranks[i];
+      int record;
       *buffers[i] >> record;
       isEOF = (record == int(-1));
@@ -457,7 +463,40 @@
 
     if (isEOF)
+    {
+      if (!wasEOF)
+        dateEOF = lastDataReceivedFromServer;
+
       serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer);
+    }
     else
       serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data);
+  }
+
+  void CField::checkForLateDataFromServer(void)
+  {
+    CContext* context = CContext::getCurrent();
+    const CDate& currentDate = context->getCalendar()->getCurrentDate();
+
+    // Check if data previously requested has been received as expected
+    if (wasDataRequestedFromServer && (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF))
+    {
+      CTimer timer("CField::checkForLateDataFromServer");
+
+      bool isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate;
+      while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout)
+      {
+        timer.resume();
+
+        context->checkBuffersAndListen();
+
+        timer.suspend();
+
+        isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate;
+      }
+
+      if (isDataLate)
+        ERROR("void CField::checkForLateDataFromServer(void)",
+              << "Late data at timestep = " << currentDate);
+    }
   }
 
Index: XIOS/trunk/src/node/field.hpp
===================================================================
--- XIOS/trunk/src/node/field.hpp	(revision 1317)
+++ XIOS/trunk/src/node/field.hpp	(revision 1318)
@@ -150,4 +150,5 @@
         static void recvReadDataReady(CEventServer& event);
         void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers);
+        void checkForLateDataFromServer(void);
         void outputField(CArray<double,3>& fieldOut);
         void outputField(CArray<double,2>& fieldOut);
@@ -197,6 +198,6 @@
          bool isEOF;
          CDate lastlast_Write_srv, last_Write_srv, last_operation_srv;
-         CDate lastDataRequestedFromServer, lastDataReceivedFromServer;
-         bool wasDataAlreadyReceivedFromServer;
+         CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF;
+         bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer;
 
          map<int,boost::shared_ptr<func::CFunctor> > foperation_srv;
Index: XIOS/trunk/src/node/file.cpp
===================================================================
--- XIOS/trunk/src/node/file.cpp	(revision 1317)
+++ XIOS/trunk/src/node/file.cpp	(revision 1318)
@@ -783,7 +783,9 @@
 
    /*!
-     Prefetching the data for enabled fields read from file whose data is out-of-date.
-   */
-   void CFile::prefetchEnabledReadModeFieldsIfNeeded(void)
+     Do all post timestep operations for enabled fields in read mode:
+      - Prefetch the data read from file when needed
+      - Check that the data excepted from server has been received
+   */
+   void CFile::doPostTimestepOperationsForEnabledReadModeFields(void)
    {
      if (mode.isEmpty() || mode.getValue() != mode_attr::read)
@@ -792,5 +794,8 @@
      int size = this->enabledFields.size();
      for (int i = 0; i < size; ++i)
+     {
+       this->enabledFields[i]->checkForLateDataFromServer();
        this->enabledFields[i]->sendReadDataRequestIfNeeded();
+     }
    }
 
Index: XIOS/trunk/src/node/file.hpp
===================================================================
--- XIOS/trunk/src/node/file.hpp	(revision 1317)
+++ XIOS/trunk/src/node/file.hpp	(revision 1318)
@@ -107,5 +107,5 @@
          void buildFilterGraphOfEnabledFields(CGarbageCollector& gc);
          void prefetchEnabledReadModeFields();
-         void prefetchEnabledReadModeFieldsIfNeeded();
+         void doPostTimestepOperationsForEnabledReadModeFields();
 
          // Add component into file
