Index: XMLIO_V2/dev/common/arch/arch-X64_TITANE.fcm
===================================================================
--- XMLIO_V2/dev/common/arch/arch-X64_TITANE.fcm	(revision 252)
+++ XMLIO_V2/dev/common/arch/arch-X64_TITANE.fcm	(revision 255)
@@ -18,3 +18,3 @@
 
 %BASE_INC       -D NONE
-%BASE_LD        -lstdc++ -lifcore -lintlc
+%BASE_LD        -lstdc++
Index: XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.f90
===================================================================
--- XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.f90	(revision 252)
+++ XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.f90	(revision 255)
@@ -176,3 +176,10 @@
    END SUBROUTINE xios_mpi_barrier
 
+   ! Collecte de donnÃ©es et rediffusion
+   SUBROUTINE xios_mpi_allgather(sendbuf, sendcount, recvbuf, recvcount, comm, ierror) BIND (C, NAME ="mpi_allgather")
+      INTEGER (kind = C_INT), DIMENSION(*) :: sendbuf, recvbuf
+      INTEGER (kind = C_INT)               :: sendcount, recvcount, comm, ierror
+       CALL MPI_ALLGATHER(sendbuf, sendcount, MPI_INTEGER, recvbuf, recvcount, MPI_INTEGER, comm, ierror)
+   END SUBROUTINE xios_mpi_allgather
+
 END MODULE IMPI_INTERFACE
Index: XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.hpp
===================================================================
--- XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.hpp	(revision 252)
+++ XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.hpp	(revision 255)
@@ -80,4 +80,7 @@
 void mpi_barrier(int * comm, int * err);
 
+/// Collecte de donnÃ©es et rediffusion ///
+void mpi_allgather(int sendbuf[], int * sendcount, int recvbuf[], int * recvcount, int * comm, int * ierror);
+
 #ifdef __cplusplus
 }
Index: XMLIO_V2/dev/common/src/xmlio/main_server.cpp
===================================================================
--- XMLIO_V2/dev/common/src/xmlio/main_server.cpp	(revision 252)
+++ XMLIO_V2/dev/common/src/xmlio/main_server.cpp	(revision 255)
@@ -16,12 +16,15 @@
    try
    {
+      MPIComm comm_client, comm_client_server, comm_server;
       //comm::CMPIManager::Initialise(&argc, &argv); // < seulement en mode connectÃ©
       //comm::CMPIManager::Finalize();               // < seulement en mode connectÃ©
 
       CXIOSManager::Initialise (CXIOSManager::CLIENT_SERVER, &argc, &argv);
-      CXIOSManager::AddClient ("nemo"    , 4, 2, &nemo_fake_entry);
+      //CXIOSManager::AddClient ("nemo"    , 4, 2, &nemo_fake_entry);
       //CXIOSManager::AddClient("orchidee", 1, 1, &orchidee_fake_entry);
       //CXIOSManager::AddClient("lmdz"    , 4, 2, &lmdz_fake_entry);
-      CXIOSManager::RunClientServer (comm::CMPIManager::GetCommWorld ());
+      CMPIManager::DispatchClient(true, comm_client, comm_client_server,  comm_server);
+      CMPIManager::RunServer("Nemo", comm_client_server, comm_server);
+      //CXIOSManager::RunClientServer (comm::CMPIManager::GetCommWorld ());
       CXIOSManager::Finalize ();
    }
Index: XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.cpp
===================================================================
--- XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.cpp	(revision 252)
+++ XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.cpp	(revision 255)
@@ -88,4 +88,61 @@
       }
 
+      bool CMPIManager::DispatchClient(bool      is_server,
+                                       MPIComm & comm_client,
+                                       MPIComm & comm_client_server,
+                                       MPIComm & comm_server,
+                                       MPIComm   comm_parent)
+      {
+         int value = (is_server) ? 1 : 2;
+         StdSize nbClient = 0, nbServer = 0, nbClientByServer = 0;
+         std::vector<int> info, rank_client, rank_server;
+         CMPIManager::AllGather(value, info, comm_parent);
+
+         for (StdSize s = 0;  s < info.size(); s++)
+         {
+            if (info[s] == 1) rank_server.push_back(s);
+            else rank_client.push_back(s);
+         }
+         nbClient = rank_client.size();
+         nbServer = rank_server.size();
+         
+
+         comm_client = CMPIManager::CreateComm(CMPIManager::CreateSubGroup(
+                       CMPIManager::GetGroupWorld(), rank_client), comm_parent);
+
+         if (nbServer != 0)
+         {
+            StdSize currentServer = 0;
+            nbClientByServer = nbClient/nbServer;
+            comm_server = CMPIManager::CreateComm(CMPIManager::CreateSubGroup(
+                          CMPIManager::GetGroupWorld(), rank_server), comm_parent);
+
+            //std::cout << nbClient << "," << nbServer  << "," << nbClientByServer << std::endl;
+
+            for (StdSize mm = 0; mm < nbClient; mm += nbClientByServer)
+            {
+               std::vector<int> group_rank;
+               group_rank.push_back(rank_server[currentServer++]);
+               for (StdSize nn = 0; nn < nbClientByServer; nn++)
+                  group_rank.push_back(rank_client[nn+mm]);
+               MPIComm comm_client_server_ = CMPIManager::CreateComm(CMPIManager::CreateSubGroup(
+                                             CMPIManager::GetGroupWorld(), group_rank), comm_parent);
+
+               if (std::find(group_rank.begin(), group_rank.end(), CMPIManager::GetCommRank()) != group_rank.end())
+               {
+                  comm_client_server = comm_client_server_;
+               }
+               
+               group_rank.clear();
+            }
+            return (true);
+         }
+         else
+         {
+            comm_server = comm_client;
+            return (false);
+         }
+      }
+
       //---------------------------------------------------------------
 
@@ -211,4 +268,21 @@
       }
 
+      void CMPIManager::AllGather(int indata, std::vector<int> & outdata, MPIComm comm)
+      {
+         std::vector<int> data; data.push_back(indata);
+         CMPIManager::AllGather(data, outdata, comm);
+      }
+
+      void  CMPIManager::AllGather(std::vector<int> & indata,
+                                   std::vector<int> & outdata, MPIComm comm)
+      {
+         int error = 0;
+         int sendcount = indata.size(), recvcount = indata.size() * CMPIManager::GetCommSize(comm);
+         outdata.resize(recvcount);
+         mpi_allgather(&(indata[0]), &sendcount, &(outdata[0]), &sendcount, &comm, &error);
+         if (error != mpi_success)
+            ERROR("CMPIManager::AllGather (indata, outdata, comm)", << " MPI Error !");
+      }
+
       //--------------------------------------------------------------
 
Index: XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.hpp
===================================================================
--- XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.hpp	(revision 252)
+++ XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.hpp	(revision 255)
@@ -40,4 +40,10 @@
             static void Barrier(MPIComm comm = CMPIManager::GetCommWorld());
 
+            static bool DispatchClient(bool      is_server,
+                                       MPIComm & comm_client,
+                                       MPIComm & comm_client_server,
+                                       MPIComm & comm_server,
+                                       MPIComm   comm_parent = CMPIManager::GetCommWorld());
+
             /// Groupes ///
             static MPIGroup GetGroupWorld(void);
@@ -53,4 +59,11 @@
             static void Wait (MPIRequest & request);
             static bool Test (MPIRequest & request);
+
+            static void AllGather(int indata, std::vector<int> & outdata,
+                                  MPIComm comm = CMPIManager::GetCommWorld());
+
+            static void AllGather(std::vector<int> & indata,
+                                  std::vector<int> & outdata,
+                                  MPIComm comm = CMPIManager::GetCommWorld());
 
             static bool HasReceivedData(MPIComm comm, int src_rank);
