Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.cpp	(revision 1883)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.cpp	(revision 1883)
@@ -0,0 +1,33 @@
+#include "file_server_reader_filter.hpp"
+#include "grid.hpp"
+#include "field.hpp"
+#include "exception.hpp"
+#include "calendar_util.hpp"
+#include <limits> 
+
+namespace xios
+{
+  CFileServerReaderFilter::CFileServerReaderFilter(CGarbageCollector& gc, CField* field) : COutputPin(gc), field_(field)
+  {
+ 
+  }
+
+  void CFileServerReaderFilter::streamData(CDate date, const CArray<double, 1>& data)
+  {
+    CDataPacketPtr packet(new CDataPacket);
+    packet->date = date;
+    packet->timestamp = date;
+    packet->status = CDataPacket::NO_ERROR;
+    packet->data.reference(data.copy()) ;
+    onOutputReady(packet);
+  }
+
+  void CFileServerReaderFilter::signalEndOfStream(CDate date)
+  {
+    CDataPacketPtr packet(new CDataPacket);
+    packet->date = date;
+    packet->timestamp = date;
+    packet->status = CDataPacket::END_OF_STREAM;
+    onOutputReady(packet);
+  }
+} // namespace xios
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.hpp	(revision 1883)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_server_reader_filter.hpp	(revision 1883)
@@ -0,0 +1,52 @@
+#ifndef __XIOS_FILE_SERVER_READER_HPP__
+#define __XIOS_FILE_SERVER_READER_HPP__
+
+#include <map>
+
+#include "output_pin.hpp"
+
+namespace xios
+{
+  class CGrid;
+  class CField;
+
+  /*!
+   * A source filter is the entry point of the data in the graph of filters. It is in charge to read data in a file on server side and
+   * injecting it into the workflow
+   */
+  class CFileServerReaderFilter : public COutputPin
+  {
+    public:
+      /*!
+       * Constructs a source filter accepting data attached to the specified grid.
+       *
+       * \param gc the garbage collector associated with this filter
+       * \param associatedField Field associated to the filter
+       */
+       CFileServerReaderFilter(CGarbageCollector& gc, CField* associatedField) ;
+
+      /*!
+       * Transforms the data received from the model into a packet and send it
+       * in the filter graph. The array containing the data can safely be reused
+       * immediately after this method returns.
+       *
+       * \param date the date associated to the data
+       * \param data an array containing the data
+       */
+      void streamData(CDate date, const CArray<double, 1>& data);
+
+      /*!
+       * Signals the filter graph that the end of stream was reached.
+       *
+       * \param date the date at which the end of stream occurred
+       */
+      void signalEndOfStream(CDate date);
+
+    private:
+      CField* field_;             //!< The field attached to the data the filter can accept
+//      const bool hasMissingValue;
+//      const double defaultValue;
+  }; // class CFileServerReaderFilter
+} // namespace xios
+
+#endif //__XIOS_FILE_SERVER_READER__
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.cpp	(revision 1883)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.cpp	(revision 1883)
@@ -0,0 +1,39 @@
+#include "server_to_client_filter.hpp"
+#include "exception.hpp"
+#include "field.hpp"
+#include "utils.hpp"
+#include "context_client.hpp"
+
+namespace xios
+{
+  CServerToClientFilter::CServerToClientFilter(CGarbageCollector& gc, CField* field, CContextClient* client)
+    : CInputPin(gc, 1)
+    , field_(field), client_(client)
+  {
+    if (!field) ERROR("CServerToClientFilter::CServerToClientFilter(CField* field)", "The field cannot be null.");
+  }
+
+  void CServerToClientFilter::onInputReady(std::vector<CDataPacketPtr> packets)
+  {
+    
+    if (packets[0]->status == CDataPacket::NO_ERROR)
+    {
+      field_->sendUpdateDataServerToClient(false, packets[0]->data, client_) ;
+    }
+    else if (packets[0]->status == CDataPacket::END_OF_STREAM)
+    {
+      field_->sendUpdateDataServerToClient(true, packets[0]->data, client_) ;
+    }
+  }
+
+
+  bool CServerToClientFilter::mustAutoTrigger() const
+  {
+    return true;
+  }
+
+  bool CServerToClientFilter::isDataExpected(const CDate& date) const
+  {
+    return true;
+  }
+} // namespace xios
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.hpp	(revision 1883)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/server_to_client_filter.hpp	(revision 1883)
@@ -0,0 +1,55 @@
+#ifndef __XIOS_SERVER_TO_CLIENT_FILTER_HPP__
+#define __XIOS_SERVER_TO_CLIENT_FILTER_HPP__
+
+#include "input_pin.hpp"
+
+namespace xios
+{
+  class CField;
+  class CContextClient ;
+
+  /*!
+   * A terminal filter which transmits the packets it receives to a field for writting in a file.
+   */
+  class CServerToClientFilter : public CInputPin
+  {
+    public:
+      /*!
+       * Constructs the filter (with one input slot) associated to the specified field
+       * and a garbage collector.
+       *
+       * \param gc the associated garbage collector
+       * \param field the associated field
+       */
+      CServerToClientFilter(CGarbageCollector& gc, CField* field, CContextClient* client);
+
+      /*!
+       * Tests if the filter must auto-trigger.
+       *
+       * \return true if the filter must auto-trigger
+       */
+      bool virtual mustAutoTrigger() const;
+
+      /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
+    protected:
+      /*!
+       * Callbacks a field to write a packet to a file.
+       *
+       * \param data a vector of packets corresponding to each slot
+       */
+      void virtual onInputReady(std::vector<CDataPacketPtr> data);
+
+    private:
+      CField* field_; //<! The associated field
+      CContextClient* client_ ; //! the associated context client
+      std::map<Time, CDataPacketPtr> packets; //<! The stored packets
+  }; // class CFileWriterFilter
+} // namespace xios
+
+#endif // XIOS_SERVER_TO_CLIENT_FILTER_HPP
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 1882)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 1883)
@@ -1166,5 +1166,10 @@
     else if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledWriteModeFiles) file->setContextClient(client) ;
 
+    // client side, assign context for file reading
     if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledReadModeFiles) file->setContextClient(client) ;
+    
+    // server side, assign context where to send file data read
+    if (serviceType_==CServicesManager::CServicesManager::GATHERER || serviceType_==CServicesManager::IO_SERVER) 
+      for(auto file : this->enabledReadModeFiles) file->setContextClient(client) ;
    
     // workflow endpoint => sent to IO/SERVER
@@ -1192,5 +1197,8 @@
     if (serviceType_==CServicesManager::IO_SERVER || serviceType_==CServicesManager::GATHERER)
     {
-      // no filter to send data from server to client => to be implemented (reading case)
+      for(auto field : fileInField) 
+      {
+        field->connectToServerToClient(garbageCollector) ;
+      }
     }
 
@@ -1247,5 +1255,8 @@
     if (serviceType_==CServicesManager::IO_SERVER || serviceType_==CServicesManager::GATHERER)
     {
-      // no filter for reading data from file => to be implemented
+      for(auto field : fileInField) 
+      {
+        field->connectToFileReader(garbageCollector) ;
+      }
     }
     
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 1882)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 1883)
@@ -24,4 +24,6 @@
 #include "spatial_transform_filter.hpp"
 #include "file_server_writer_filter.hpp"
+#include "file_server_reader_filter.hpp"
+#include "server_to_client_filter.hpp"
 #include "tracer.hpp"
 
@@ -435,12 +437,20 @@
   TRY
   {
-    CContextClient* client = server->getAssociatedClient() ;
+        
+    CArray<double,1> data ;
+    EReadField hasData = readField(data);
+    CDate date = CContext::getCurrent()->getCalendar()->getCurrentDate();
+    if (hasData == RF_DATA) fileServerReaderFilter_->streamData(date,data) ;
+    else fileServerReaderFilter_->signalEndOfStream(date) ;
+
+  }
+  CATCH_DUMP_ATTR
+
+
+  void CField::sendUpdateDataServerToClient(bool isEOF, const CArray<double,1>& data, CContextClient* client)
+  TRY
+  {
     CEventClient event(getType(), EVENT_ID_READ_DATA_READY);
     std::list<CMessage> msgs;
-    
-    CArray<double,1> data ;
-    EReadField hasData = readField(data);
-
-    map<int, CArray<double,1> >::iterator it;
     if (!grid_->doGridHaveDataDistributed(client))
     {
@@ -455,18 +465,8 @@
               CMessage& msg = msgs.back();
               msg << getId();
-              switch (hasData)
-              {
-                case RF_DATA:
-                  msg << getNStep() - 1 << data;
-                  break;
-                case RF_NODATA:
-                  msg << int(-2) << data;
-                  break;
-                case RF_EOF:                  
-                default:
-                  msg << int(-1);
-                  break;
-              }
-
+              
+              if (isEOF)  msg << int(-1);
+              else msg << getNStep() - 1 << data;
+         
               event.push(*itRank, 1, msg);
             }
@@ -484,28 +484,17 @@
       for (auto it = outLocalIndexStoreOnClient.begin(); it != outLocalIndexStoreOnClient.end(); ++it)
       {
-        CArray<size_t,1>& indexTmp = it->second;
-        CArray<double,1> tmp(indexTmp.numElements());
-        for (int idx = 0; idx < indexTmp.numElements(); ++idx)
-        {
-          tmp(idx) = data(indexTmp(idx));
-        } 
+        
 
         msgs.push_back(CMessage());
         CMessage& msg = msgs.back();
         msg << getId();
-        switch (hasData)
+        if (isEOF) msg << int(-1);
+        else 
         {
-          case RF_DATA:
-            msg << getNStep() - 1 << tmp;
-            break;
-          case RF_NODATA:
-            msg << int(-2) << tmp;
-            break;
-          case RF_EOF:                  
-          default:
-            msg << int(-1);
-            break;
+          CArray<size_t,1>& indexTmp = it->second;
+          CArray<double,1> tmp(indexTmp.numElements());
+          for (int idx = 0; idx < indexTmp.numElements(); ++idx) tmp(idx) = data(indexTmp(idx));
+          msg << getNStep() - 1 << tmp;
         }
-
         event.push(it->first, grid_->getNbReadSenders(client)[it->first], msg);
       }
@@ -1481,4 +1470,12 @@
   } 
   
+  /*!
+   * Connect field to a file reader filter to read data from file (on server side).
+   */
+  void CField::connectToFileReader(CGarbageCollector& gc)
+  {
+    fileServerReaderFilter_ = std::shared_ptr<CFileServerReaderFilter>(new CFileServerReaderFilter(gc, this));
+    fileServerReaderFilter_->connectOutput(inputFilter, 0);
+  } 
 
   /*!
@@ -1492,4 +1489,12 @@
     storeFilter = std::shared_ptr<CStoreFilter>(new CStoreFilter(gc, CContext::getCurrent(), grid_, detectMissingValues, defaultValue));
     instantDataFilter->connectOutput(storeFilter, 0);
+  }
+
+
+ 
+  void CField::connectToServerToClient(CGarbageCollector& gc)
+  {
+    serverToClientFilter_ = std::shared_ptr<CServerToClientFilter>(new CServerToClientFilter(gc, this, client));
+    instantDataFilter->connectOutput(serverToClientFilter_, 0);
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 1882)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 1883)
@@ -43,5 +43,6 @@
    class CFileWriterFilter;
    class CFileServerWriterFilter;
-
+   class CFileServerReaderFilter;
+   class CServerToClientFilter;
    ///--------------------------------------------------------------
 
@@ -183,6 +184,7 @@
         static bool dispatchEvent(CEventServer& event);
         void sendAllAttributesToServer(CContextClient* client) ; 
-        void sendUpdateData(const CArray<double,1>& data);
         void sendUpdateData(Time timestamp, const CArray<double,1>& data, CContextClient* client);
+        void sendUpdateDataServerToClient(bool isEOF, const CArray<double,1>& data, CContextClient* client) ;
+
         static void recvUpdateData(CEventServer& event);
         void recvUpdateData(std::map<int,CBufferIn*>& rankBuffers);
@@ -250,4 +252,6 @@
         void connectToServerInput(CGarbageCollector& gc) ;
         void connectToModelOutput(CGarbageCollector& gc);
+        void connectToFileReader(CGarbageCollector& gc) ;
+        void connectToServerToClient(CGarbageCollector& gc) ;
 
         void computeGridIndexToFileServer(void) ;
@@ -402,4 +406,12 @@
          //! The terminal filter which writes data to file
          std::shared_ptr<CFileServerWriterFilter> fileServerWriterFilter;
+
+         //! The source filter which read data from file
+         std::shared_ptr<CFileServerReaderFilter> fileServerReaderFilter_;
+
+         //! The terminal filter which send data from file server to client
+         std::shared_ptr<CServerToClientFilter> serverToClientFilter_;
+
+
    }; // class CField
 
