Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.cpp	(revision 2230)
@@ -56,6 +56,6 @@
   //  {
       //if (!isAttachedModeEnabled()) eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ;
-      eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ;
-
+    eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ;
+    MPI_Comm_dup(intraComm, &processEventBarrier_) ;
   //  }
 
@@ -92,5 +92,7 @@
         }
         else MPI_Comm_split(interCommMerged, interCommMergedRank, rank, &winComm);
-        MPI_Comm_free(&winComm) ;
+//       ym : Warning : intelMPI doesn't support that communicator of windows be deallocated before the windows deallocation, crash at MPI_Win_lock
+//            Bug or not ?          
+        // MPI_Comm_free(&winComm) ;
       }
     }
@@ -346,15 +348,21 @@
         else if (isAttachedModeEnabled() || eventScheduler_->queryEvent(currentTimeLine,hashId) )
         {
-          MPI_Request req ;
-          MPI_Status status ;
-
-          MPI_Ibarrier(intraComm,&req) ;
-          int flag=false ;
-          do  
+
+          if (!eventScheduled_) 
           {
-            eventScheduler_->checkEvent()  ;
-            MPI_Test(&req,&flag,&status) ;
-          } while (!flag) ;
-
+            MPI_Ibarrier(processEventBarrier_,&processEventRequest_) ;
+            eventScheduled_=true ;
+            return ;
+          }
+          else 
+          {
+            MPI_Status status ;
+            int flag ;
+            MPI_Test(&processEventRequest_, &flag, &status) ;
+            if (!flag) return ;
+            eventScheduled_=false ;
+          }
+
+          if (!isAttachedModeEnabled()) eventScheduler_->popEvent() ;
           //MPI_Barrier(intraComm) ;
          // When using attached mode, synchronise the processes to avoid that differents event be scheduled by differents processes
@@ -469,3 +477,9 @@
     }
   }
+
+  bool CContextServer::isCollectiveEvent(CEventServer& event)
+  {
+    if (event.classId==CField::GetType()) return CField::isCollectiveEvent(event);
+    else return true ;
+  }
 }
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.hpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.hpp	(revision 2230)
@@ -26,4 +26,5 @@
     bool hasFinished(void);
     void dispatchEvent(CEventServer& event) ;
+    bool isCollectiveEvent(CEventServer& event) ;
     void setPendingEvent(void) ;
     bool hasPendingEvent(void) ;
@@ -67,4 +68,5 @@
 
     private:
+
       std::map<int, StdSize> mapBufferSize_;
       vector<MPI_Win> windows ; //! one sided mpi windows to expose client buffers to servers ; No memory will be attached on server side.
@@ -73,4 +75,8 @@
       CContextClient* associatedClient_ ;
       size_t remoteHashId_; //!< the hash is of the calling context client
+      
+      MPI_Comm processEventBarrier_ ;
+      bool eventScheduled_=false;
+      MPI_Request processEventRequest_ ;
   } ;
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.cpp	(revision 2230)
@@ -98,10 +98,10 @@
     if (! eventStack.empty() && eventStack.front().first==timeLine && eventStack.front().second==contextHashId)
     {
-      eventStack.pop() ;
+      //eventStack.pop() ;
       return true ;
     }
     else return false ; 
   } 
-  
+ 
   void CEventScheduler::checkEvent(void)
   {
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.hpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.hpp	(revision 2230)
@@ -52,4 +52,5 @@
         */    
        bool queryEvent(const size_t timeLine, const size_t contextHashId) ;
+       void popEvent() { eventStack.pop() ; }
 
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/server_context.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/server_context.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/server_context.cpp	(revision 2230)
@@ -216,4 +216,5 @@
       if (eventScheduler->queryEvent(currentTimeLine,hashId))
       {
+        eventScheduler->popEvent() ;
         if (notifyInType_==NOTIFY_CREATE_INTERCOMM) createIntercomm() ;
         hasNotification_=false ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/services.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/services.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/services.cpp	(revision 2230)
@@ -181,4 +181,5 @@
       if (eventScheduler_->queryEvent(currentTimeLine,hashId))
       {
+        eventScheduler_->popEvent() ;
         if (notifyInType_==NOTIFY_CREATE_CONTEXT) createContext() ;
         hasNotification_=false ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 2230)
@@ -612,5 +612,10 @@
     { 
       finished=eventLoop(enableEventsProcessing) ;
-      if (serviceType_==CServicesManager::CLIENT) out = eventScheduler_->queryEvent(timeLine,hashId_) ;
+      if (serviceType_==CServicesManager::CLIENT) 
+      {  
+        out = eventScheduler_->queryEvent(timeLine,hashId_) ;
+        if (out) eventScheduler_->popEvent() ;
+      }
+
       else out=true ;
     }  while(!out) ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 2230)
@@ -135,5 +135,45 @@
   }
   CATCH
-
+  
+  bool CField::isCollectiveEvent(CEventServer& event)
+  TRY
+  {
+    switch(event.type)
+    {
+      case EVENT_ID_UPDATE_DATA :
+        recvUpdateData(event);
+        return true;
+        break;
+
+      case EVENT_ID_READ_DATA :
+        recvReadDataRequest(event);
+        return true;
+        break;
+
+      case EVENT_ID_READ_DATA_READY :
+        recvReadDataReady(event);
+        return false;
+        break;
+
+      case EVENT_ID_ADD_VARIABLE :
+        recvAddVariable(event);
+        return false;
+        break;
+
+      case EVENT_ID_ADD_VARIABLE_GROUP :
+        recvAddVariableGroup(event);
+        return false;
+        break;
+     
+      case EVENT_ID_GRID_COMPLETED :
+        recvGridCompleted(event);
+        return true;
+        break;
+      default :
+        ERROR("bool CField::dispatchEvent(CEventServer& event)", << "Unknown Event");
+        return false;
+    }
+  }
+  CATCH
 
   void CField::recvUpdateData(CEventServer& event)
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 2229)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 2230)
@@ -179,4 +179,5 @@
         template <int N> void setData(const CArray<double, N>& _data);
         static bool dispatchEvent(CEventServer& event);
+        static bool isCollectiveEvent(CEventServer& event);
         void sendAllAttributesToServer(CContextClient* client) ; 
         
