diff --git a/extra_packages/extra-materials b/extra_packages/extra-materials
index 7cfc6a9a8..3a765d092 160000
--- a/extra_packages/extra-materials
+++ b/extra_packages/extra-materials
@@ -1 +1 @@
-Subproject commit 7cfc6a9a8304dc90f0049b0fb3f2d45d30c1bb27
+Subproject commit 3a765d092ea1b310b0810a1098ba227e6a6a5ce8
diff --git a/extra_packages/igfem b/extra_packages/igfem
index 8f34e1004..dac505891 160000
--- a/extra_packages/igfem
+++ b/extra_packages/igfem
@@ -1 +1 @@
-Subproject commit 8f34e1004c34e4485294165aa5990b6dc15b07c7
+Subproject commit dac505891dae7b6a6734153dabc9797cce24daf0
diff --git a/extra_packages/traction-at-split-node-contact b/extra_packages/traction-at-split-node-contact
index 95926b0cf..58a131ff2 160000
--- a/extra_packages/traction-at-split-node-contact
+++ b/extra_packages/traction-at-split-node-contact
@@ -1 +1 @@
-Subproject commit 95926b0cfda429a6c2adde41924aa2081892a7ad
+Subproject commit 58a131ff2edfa4a6274d61d7ac80a5e4a0faf2b6
diff --git a/src/synchronizer/distributed_synchronizer.hh b/src/synchronizer/distributed_synchronizer.hh
index 5b0eb1d36..6206401c2 100644
--- a/src/synchronizer/distributed_synchronizer.hh
+++ b/src/synchronizer/distributed_synchronizer.hh
@@ -1,296 +1,300 @@
 /**
  * @file   distributed_synchronizer.hh
  *
  * @author Guillaume Anciaux <guillaume.anciaux@epfl.ch>
  * @author Dana Christen <dana.christen@epfl.ch>
  * @author Marco Vocialta <marco.vocialta@epfl.ch>
  * @author Nicolas Richart <nicolas.richart@epfl.ch>
  *
  * @date creation: Thu Jun 16 2011
  * @date last modification: Fri Sep 05 2014
  *
  * @brief  wrapper to the static communicator
  *
  * @section LICENSE
  *
  * Copyright (©) 2010-2012, 2014 EPFL (Ecole Polytechnique Fédérale de Lausanne)
  * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
  *
  * Akantu is free  software: you can redistribute it and/or  modify it under the
  * terms  of the  GNU Lesser  General Public  License as  published by  the Free
  * Software Foundation, either version 3 of the License, or (at your option) any
  * later version.
  *
  * Akantu is  distributed in the  hope that it  will be useful, but  WITHOUT ANY
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A  PARTICULAR PURPOSE. See  the GNU  Lesser General  Public License  for more
  * details.
  *
  * You should  have received  a copy  of the GNU  Lesser General  Public License
  * along with Akantu. If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 /* -------------------------------------------------------------------------- */
 
 #ifndef __AKANTU_DISTRIBUTED_SYNCHRONIZER_HH__
 #define __AKANTU_DISTRIBUTED_SYNCHRONIZER_HH__
 
 /* -------------------------------------------------------------------------- */
 #include "aka_common.hh"
 #include "aka_array.hh"
 #include "synchronizer.hh"
 #include "mesh.hh"
 #include "mesh_partition.hh"
 #include "communication_buffer.hh"
 
 /* -------------------------------------------------------------------------- */
 
 __BEGIN_AKANTU__
 
 class DistributedSynchronizer : public Synchronizer, public MeshEventHandler {
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 public:
   DistributedSynchronizer(Mesh & mesh,
                           SynchronizerID id = "distributed_synchronizer",
                           MemoryID memory_id = 0,
 			  const bool register_to_event_manager = true);
 
 public:
   virtual ~DistributedSynchronizer();
 
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
   /// get a  mesh and a partition and  create the local mesh  and the associated
   /// DistributedSynchronizer
   static DistributedSynchronizer *
   createDistributedSynchronizerMesh(Mesh & mesh,
                                     const MeshPartition * partition,
                                     UInt root = 0,
                                     SynchronizerID id = "distributed_synchronizer",
                                     MemoryID memory_id = 0);
 
   /* ------------------------------------------------------------------------ */
   /* Inherited from Synchronizer                                              */
   /* ------------------------------------------------------------------------ */
 
   /// asynchronous synchronization of ghosts
   void asynchronousSynchronize(DataAccessor & data_accessor,SynchronizationTag tag);
 
   /// wait end of asynchronous synchronization of ghosts
   void waitEndSynchronize(DataAccessor & data_accessor,SynchronizationTag tag);
 
   /// build processor to element corrispondance
   void buildPrankToElement();
 
   virtual void printself(std::ostream & stream, int indent = 0) const;
 
   /// mesh event handler onElementsChanged
   virtual void onElementsChanged(const Array<Element> & old_elements_list,
 				 const Array<Element> & new_elements_list,
                                  const ElementTypeMapArray<UInt> & new_numbering,
                                  const ChangedElementsEvent & event);
 
   /// mesh event handler onRemovedElement
   virtual void onElementsRemoved(const Array<Element> & element_list,
                                  const ElementTypeMapArray<UInt> & new_numbering,
                                  const RemovedElementsEvent & event);
-
+  /// mesh event handler onNodesAdded
   virtual void onNodesAdded  (const Array<UInt> & nodes_list,
                               const NewNodesEvent & event) {};
+
+  /// mesh event handler onRemovedNodes
   virtual void onNodesRemoved(const Array<UInt> & nodes_list,
                               const Array<UInt> & new_numbering,
                               const RemovedNodesEvent & event) {};
+
+  /// mesh event handler onElementsAdded
   virtual void onElementsAdded  (const Array<Element> & elements_list,
                                  const NewElementsEvent & event) {};
 
   /// filter elements of a certain kind and copy them into a new synchronizer
   void filterElementsByKind(DistributedSynchronizer * new_synchronizer,
 			    ElementKind kind);
 
   /// reset send and recv element lists
   void reset();
 
   /// compute buffer size for a given tag and data accessor
   void computeBufferSize(DataAccessor & data_accessor, SynchronizationTag tag);
 
   /// recalculate buffer sizes for all tags
   void computeAllBufferSizes(DataAccessor & data_accessor);
 
   /// remove elements from the synchronizer without renumbering them
   void removeElements(const Array<Element> & element_to_remove);
 
   /// renumber the elements in the synchronizer
   void renumberElements(const ElementTypeMapArray<UInt> & new_numbering);
 
 		      
 protected:
   /// fill the nodes type vector
   void fillNodesType(Mesh & mesh);
 
   void fillNodesType(const MeshData & mesh_data,
                      DynamicCommunicationBuffer * buffers,
                      const std::string & tag_name,
                      const ElementType & el_type,
                      const Array<UInt> & partition_num);
 
   template<typename T>
   void fillTagBufferTemplated(const MeshData & mesh_data,
                               DynamicCommunicationBuffer * buffers,
                               const std::string & tag_name,
                               const ElementType & el_type,
                               const Array<UInt> & partition_num,
                               const CSR<UInt> & ghost_partition);
 
   void fillTagBuffer(const MeshData & mesh_data,
                      DynamicCommunicationBuffer * buffers,
                      const std::string & tag_name,
                      const ElementType & el_type,
                      const Array<UInt> & partition_num,
                      const CSR<UInt> & ghost_partition);
 
   template<typename T, typename BufferType>
   void populateMeshDataTemplated(MeshData & mesh_data,
                                  BufferType & buffer,
                                  const std::string & tag_name,
                                  const ElementType & el_type,
                                  UInt nb_component,
                                  UInt nb_local_element,
                                  UInt nb_ghost_element);
 
   template <typename BufferType>
   void populateMeshData(MeshData & mesh_data,
                         BufferType & buffer,
                         const std::string & tag_name,
                         const ElementType & el_type,
                         const MeshDataTypeCode & type_code,
                         UInt nb_component,
                         UInt nb_local_element,
                         UInt nb_ghost_element);
 
   /// fill the communications array of a distributedSynchronizer based on a partition array
   void fillCommunicationScheme(const UInt * partition,
                                UInt nb_local_element,
                                UInt nb_ghost_element,
                                ElementType type);
 
   /// function that handels the MeshData to be split (root side)
   static void synchronizeTagsSend(DistributedSynchronizer & communicator,
 				  UInt root,
 				  Mesh & mesh,
 				  UInt nb_tags,
 				  const ElementType & type,
 				  const Array<UInt> & partition_num,
 				  const CSR<UInt> & ghost_partition,
 				  UInt nb_local_element,
 				  UInt nb_ghost_element);
 
   /// function that handles the MeshData to be split (other nodes)
   static void synchronizeTagsRecv(DistributedSynchronizer & communicator,
 				  UInt root,
 				  Mesh & mesh,
 				  UInt nb_tags,
 				  const ElementType & type,
 				  UInt nb_local_element,
 				  UInt nb_ghost_element);
 
   /// function that handles the preexisting groups in the mesh
   static void synchronizeElementGroups(DistributedSynchronizer & communicator,
 				       UInt root,
 				       Mesh & mesh,
 				       const ElementType & type,
 				       const Array<UInt> & partition_num,
 				       const CSR<UInt> & ghost_partition,
 				       UInt nb_element);
 
 
   /// function that handles the preexisting groups in the mesh
   static void synchronizeElementGroups(DistributedSynchronizer & communicator,
 				       UInt root,
 				       Mesh & mesh,
 				       const ElementType & type);
 
   template<class CommunicationBuffer>
   static void fillElementGroupsFromBuffer(DistributedSynchronizer & communicator,
 					  Mesh & mesh,
 					  const ElementType & type,
 					  CommunicationBuffer & buffer);
 
   /// function that handles the preexisting groups in the mesh
   static void synchronizeNodeGroupsMaster(DistributedSynchronizer & communicator,
 					  UInt root,
 					  Mesh & mesh);
 
 
   /// function that handles the preexisting groups in the mesh
   static void synchronizeNodeGroupsSlaves(DistributedSynchronizer & communicator,
 					  UInt root,
 					  Mesh & mesh);
 
   template<class CommunicationBuffer>
   static void fillNodeGroupsFromBuffer(DistributedSynchronizer & communicator,
 					  Mesh & mesh,
 					  CommunicationBuffer & buffer);
 
   /// substitute elements in the send and recv arrays
   void substituteElements(const std::map<Element, Element> & old_to_new_elements);
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
 
   AKANTU_GET_MACRO(PrankToElement, prank_to_element, const ElementTypeMapArray<UInt> &);
 
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 private:
   enum CommTags {
     TAG_SIZES        = 0,
     TAG_CONNECTIVITY = 1,
     TAG_DATA         = 2,
     TAG_PARTITIONS   = 3,
     TAG_NB_NODES     = 4,
     TAG_NODES        = 5,
     TAG_COORDINATES  = 6,
     TAG_NODES_TYPE   = 7,
     TAG_MESH_DATA    = 8,
     TAG_ELEMENT_GROUP = 9,
     TAG_NODE_GROUP = 10,
   };
 
 protected:
   /// reference to the underlying mesh
   Mesh & mesh;
 
   std::map<SynchronizationTag, Communication> communications;
 
   /// list of element to send to proc p
   Array<Element> * send_element;
   /// list of element to receive from proc p
   Array<Element> * recv_element;
 
   UInt nb_proc;
   UInt rank;
 
   friend class FilteredSynchronizer;
   friend class FacetSynchronizer;
 
   ElementTypeMapArray<UInt> prank_to_element;
 
 };
 
 __END_AKANTU__
 
 /* -------------------------------------------------------------------------- */
 /* inline functions                                                           */
 /* -------------------------------------------------------------------------- */
 #include "distributed_synchronizer_tmpl.hh"
 
 
 #endif /* __AKANTU_DISTRIBUTED_SYNCHRONIZER_HH__ */
diff --git a/src/synchronizer/dof_synchronizer.hh b/src/synchronizer/dof_synchronizer.hh
index 16f2f9a77..435f246c1 100644
--- a/src/synchronizer/dof_synchronizer.hh
+++ b/src/synchronizer/dof_synchronizer.hh
@@ -1,237 +1,244 @@
 /**
  * @file   dof_synchronizer.hh
  *
  * @author Nicolas Richart <nicolas.richart@epfl.ch>
  * @author Aurelia Cuba Ramos <aurelia.cubaramos@epfl.ch>
  *
  * @date creation: Fri Jun 17 2011
  * @date last modification: Fri Mar 21 2014
  *
  * @brief  Synchronize Array of DOFs
  *
  * @section LICENSE
  *
  * Copyright (©) 2010-2012, 2014 EPFL (Ecole Polytechnique Fédérale de Lausanne)
  * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
  *
  * Akantu is free  software: you can redistribute it and/or  modify it under the
  * terms  of the  GNU Lesser  General Public  License as  published by  the Free
  * Software Foundation, either version 3 of the License, or (at your option) any
  * later version.
  *
  * Akantu is  distributed in the  hope that it  will be useful, but  WITHOUT ANY
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A  PARTICULAR PURPOSE. See  the GNU  Lesser General  Public License  for more
  * details.
  *
  * You should  have received  a copy  of the GNU  Lesser General  Public License
  * along with Akantu. If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 /* -------------------------------------------------------------------------- */
 #include "aka_common.hh"
 #include "aka_array.hh"
 #include "static_communicator.hh"
 #include "synchronizer.hh"
 
 /* -------------------------------------------------------------------------- */
 
 
 
 #ifndef __AKANTU_DOF_SYNCHRONIZER_HH__
 #define __AKANTU_DOF_SYNCHRONIZER_HH__
 
 __BEGIN_AKANTU__
 
 class Mesh;
 
 template<typename T>
 class AddOperation {
 public:
   inline T operator()(T & b, T & a) { return a + b; };
 };
 
 
 class DOFSynchronizer : public Synchronizer {
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 public:
 
   DOFSynchronizer(const Mesh & mesh, UInt nb_degree_of_freedom);
   virtual ~DOFSynchronizer();
 
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
 
   /// asynchronous synchronization of ghosts
   virtual void asynchronousSynchronize(DataAccessor & data_accessor,SynchronizationTag tag);
 
   /// wait end of asynchronous synchronization of ghosts
   virtual void waitEndSynchronize(DataAccessor & data_accessor,SynchronizationTag tag);
 
   /// compute buffer size for a given tag and data accessor
   virtual void computeBufferSize(DataAccessor & data_accessor, SynchronizationTag tag);
 
   /// init the scheme for scatter and gather operation, need extra memory
   void initScatterGatherCommunicationScheme();
 
   /// initialize the equation number with local ids
   void initLocalDOFEquationNumbers();
 
   /// initialize the equation number with local ids
   void initGlobalDOFEquationNumbers();
 
   /**
    * Gather the DOF value on the root proccessor
    *
    * @param to_gather data to gather
    * @param root processor on which data are gathered
    * @param gathered Array containing the gathered data, only valid on root processor
    */
   template<typename T>
+  /// Gather the DOF value on the root proccessor
   void gather(const Array<T> & to_gather, UInt root,
 	      Array<T> * gathered = NULL) const;
 
   /**
    * Scatter a DOF Array form root to all processors
    *
    * @param scattered data to scatter, only valid on root processor
    * @param root processor scattering data
    * @param to_scatter result of scattered data
    */
   template<typename T>
+  /// Scatter a DOF Array form root to all processors
   void scatter(Array<T> & scattered, UInt root,
 	       const Array<T> * to_scatter = NULL) const;
 
-
+  
   template<typename T> void synchronize(Array<T> & vector) const ;
   template<template <class> class Op, typename T> void reduceSynchronize(Array<T> & vector) const;
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
   /// get the equation_number Array
   AKANTU_GET_MACRO(LocalDOFEquationNumbers, local_dof_equation_numbers, const Array<Int> &);
   AKANTU_GET_MACRO(GlobalDOFEquationNumbers, global_dof_equation_numbers, const Array<Int> &);
 
   Array<Int> * getLocalDOFEquationNumbersPointer(){return &local_dof_equation_numbers;};
   Array<Int> * getGlobalDOFEquationNumbersPointer(){return &global_dof_equation_numbers;};
 
   typedef unordered_map<Int, UInt>::type GlobalEquationNumberMap;
 
   AKANTU_GET_MACRO(GlobalEquationNumberToLocal, global_dof_equation_number_to_local, const GlobalEquationNumberMap &)
 
   /// get the Array of global ids of the dofs
   AKANTU_GET_MACRO(DOFGlobalIDs, dof_global_ids, const Array<UInt> &);
 
   /// get the global id of a dof
   inline UInt getDOFGlobalID(UInt local_id) const {
     return dof_global_ids(local_id);
   }
 
   /// get the local id of a global dof
   inline UInt getDOFLocalID(UInt global_id) const {
     return global_dof_to_local.find(global_id)->second;
   }
 
   /// get the DOF type Array
   AKANTU_GET_MACRO(DOFTypes, dof_types, const Array<Int> &);
 
   AKANTU_GET_MACRO(NbDOFs, nb_dofs, UInt);
 
   AKANTU_GET_MACRO(NbGlobalDOFs, nb_global_dofs, UInt);
 
   /// say if a node is a pure ghost node
   inline bool isPureGhostDOF(UInt n) const;
 
   /// say if a node is pure local or master node
   inline bool isLocalOrMasterDOF(UInt n) const;
 
+  /// say if a node is pure local 
   inline bool isLocalDOF(UInt n) const;
+
+  /// say if a node is a master node
   inline bool isMasterDOF(UInt n) const;
+
+  /// say if a node is a slave node
   inline bool isSlaveDOF(UInt n) const;
 
 
 
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 private:
 
   /// equation number position where a dof is synchronized in the matrix (by default = global id)
   Array<Int> global_dof_equation_numbers;
   Array<Int> local_dof_equation_numbers;
   GlobalEquationNumberMap global_dof_equation_number_to_local;
 
   /// DOF global id
   Array<UInt> dof_global_ids;
 
   /*
    * DOF type  -3 pure ghost, -2  master for the dof, -1 normal dof,  i in
    * [0-N] slave dof and master is proc i
    */
   Array<Int> dof_types;
 
   /// number of dofs
   UInt nb_dofs;
 
   UInt nb_global_dofs;
 
   unordered_map<UInt, UInt>::type global_dof_to_local;
 
   UInt prank;
   UInt psize;
 
   struct PerProcInformations {
     /// dofs to send to the proc
     Array<UInt> slave_dofs;
     /// dofs to recvs from the proc
     Array<UInt> master_dofs;
 
     /* ---------------------------------------------------------------------- */
     /* Data for gather/scatter                                                */
     /* ---------------------------------------------------------------------- */
     /// the dof that the node handle
     Array<UInt> dofs;
     /// the dof that the proc need
     Array<UInt> needed_dofs;
   };
 
   std::vector<PerProcInformations> proc_informations;
 
   /// nb dofs with type -1 or -2
   UInt nb_local_dofs;
   /// nb dof with type >= 0
   UInt nb_needed_dofs;
 
   bool gather_scatter_scheme_initialized;
 
 
   std::map<SynchronizationTag, Communication> communications; 
 };
 
 
 /* -------------------------------------------------------------------------- */
 /* inline functions                                                           */
 /* -------------------------------------------------------------------------- */
 
 #if defined (AKANTU_INCLUDE_INLINE_IMPL)
 #  include "dof_synchronizer_inline_impl.cc"
 #endif
 
 /// standard output stream operator
 // inline std::ostream & operator <<(std::ostream & stream, const DOFSynchronizer & _this)
 // {
 //   _this.printself(stream);
 //   return stream;
 // }
 
 
 __END_AKANTU__
 
 #endif /* __AKANTU_DOF_SYNCHRONIZER_HH__ */
diff --git a/src/synchronizer/filtered_synchronizer.hh b/src/synchronizer/filtered_synchronizer.hh
index c4a4d85de..c508fb3b4 100644
--- a/src/synchronizer/filtered_synchronizer.hh
+++ b/src/synchronizer/filtered_synchronizer.hh
@@ -1,98 +1,100 @@
 /**
  * @file   filtered_synchronizer.hh
  *
  * @author David Simon Kammer <david.kammer@epfl.ch>
  * @author Mathilde Radiguet <mathilde.radiguet@epfl.ch>
  *
  * @date creation: Wed Sep 18 2013
  * @date last modification: Fri Sep 27 2013
  *
  * @brief  synchronizer that filters elements from another synchronizer
  *
  * @section LICENSE
  *
  * Copyright (©) 2014 EPFL (Ecole Polytechnique Fédérale de Lausanne)
  * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
  *
  * Akantu is free  software: you can redistribute it and/or  modify it under the
  * terms  of the  GNU Lesser  General Public  License as  published by  the Free
  * Software Foundation, either version 3 of the License, or (at your option) any
  * later version.
  *
  * Akantu is  distributed in the  hope that it  will be useful, but  WITHOUT ANY
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A  PARTICULAR PURPOSE. See  the GNU  Lesser General  Public License  for more
  * details.
  *
  * You should  have received  a copy  of the GNU  Lesser General  Public License
  * along with Akantu. If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 /* -------------------------------------------------------------------------- */
 
 #ifndef __AKANTU_FILTERED_SYNCHRONIZER_HH__
 #define __AKANTU_FILTERED_SYNCHRONIZER_HH__
 
 /* -------------------------------------------------------------------------- */
 #include "distributed_synchronizer.hh"
 
 /* -------------------------------------------------------------------------- */
 __BEGIN_AKANTU__
 
 /* -------------------------------------------------------------------------- */
 class SynchElementFilter {
 public:
   virtual bool operator()(const Element &) = 0;
 };
 
 /* -------------------------------------------------------------------------- */
 class FilteredSynchronizer : public DistributedSynchronizer {
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 public:
   
   FilteredSynchronizer(Mesh & mesh,
 		       SynchronizerID id = "filtered_synchronizer",
 		       MemoryID memory_id = 0);
   virtual ~FilteredSynchronizer() {};
   
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
-  // get another synchronizer and filter its elements using a functor
+  /// get another synchronizer and filter its elements using a functor
   static FilteredSynchronizer * 
   createFilteredSynchronizer(const DistributedSynchronizer & d_synchronizer,
 			     SynchElementFilter & filter);
 
 protected:
+  /// set up the synchronizer
   void setupSynchronizer(const DistributedSynchronizer & d_synchronizer,
 			 SynchElementFilter & filter);
-
+  /// push source elements into destination elements through the filter
   void updateElementList(Array<Element> * source_elements,
 			 Array<Element> * destination_elements,
 			 SynchElementFilter & filter);
 
 
 protected:
+  /// Define the receive list tag
   enum CommTags {
     RECEIVE_LIST_TAG  = 0
   };
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
   
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 private:
   
 };
 
 __END_AKANTU__
 
 #endif /* __AKANTU_FILTERED_SYNCHRONIZER_HH__ */
diff --git a/src/synchronizer/grid_synchronizer.hh b/src/synchronizer/grid_synchronizer.hh
index 9af8226be..22331a268 100644
--- a/src/synchronizer/grid_synchronizer.hh
+++ b/src/synchronizer/grid_synchronizer.hh
@@ -1,96 +1,101 @@
 /**
  * @file   grid_synchronizer.hh
  *
  * @author Nicolas Richart <nicolas.richart@epfl.ch>
  *
  * @date creation: Mon Oct 03 2011
  * @date last modification: Thu Feb 21 2013
  *
  * @brief  synchronizer based in RegularGrid
  *
  * @section LICENSE
  *
  * Copyright (©) 2014 EPFL (Ecole Polytechnique Fédérale de Lausanne)
  * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
  *
  * Akantu is free  software: you can redistribute it and/or  modify it under the
  * terms  of the  GNU Lesser  General Public  License as  published by  the Free
  * Software Foundation, either version 3 of the License, or (at your option) any
  * later version.
  *
  * Akantu is  distributed in the  hope that it  will be useful, but  WITHOUT ANY
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A  PARTICULAR PURPOSE. See  the GNU  Lesser General  Public License  for more
  * details.
  *
  * You should  have received  a copy  of the GNU  Lesser General  Public License
  * along with Akantu. If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 /* -------------------------------------------------------------------------- */
 #include "aka_common.hh"
 #include "distributed_synchronizer.hh"
 #include "synchronizer_registry.hh"
 
 /* -------------------------------------------------------------------------- */
 
 
 #ifndef __AKANTU_GRID_SYNCHRONIZER_HH__
 #define __AKANTU_GRID_SYNCHRONIZER_HH__
 
 __BEGIN_AKANTU__
 
 class Mesh;
 template<class T>
 class SpatialGrid;
 
 class GridSynchronizer : public DistributedSynchronizer {
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 protected:
   GridSynchronizer(Mesh & mesh, const ID & id = "grid_synchronizer", MemoryID memory_id = 0,
 		   const bool register_to_event_manager = true);
 
 public:
   virtual ~GridSynchronizer() { };
 
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
+   /**
+   *Create the Grid Synchronizer:
+   *Compute intersection and send info to neighbours that will be stored in ghosts elements
+   */
   template <class E>
   static GridSynchronizer *
   createGridSynchronizer(Mesh & mesh,
 			 const SpatialGrid<E> & grid,
 			 SynchronizerID id = "grid_synchronizer",
 			 SynchronizerRegistry * synch_registry = NULL,
 			 const std::set<SynchronizationTag> & tags_to_register = std::set<SynchronizationTag>(),
 			 MemoryID memory_id = 0, const bool register_to_event_manager = true);
 
 
 protected:
+  /// Define the tags that will be used in the send and receive instructions
   enum CommTags {
     SIZE_TAG        = 0,
     DATA_TAG        = 1,
     ASK_NODES_TAG   = 2,
     SEND_NODES_TAG  = 3
   };
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
 
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 private:
 
 };
 
 
 __END_AKANTU__
 
 #endif /* __AKANTU_GRID_SYNCHRONIZER_HH__ */
diff --git a/src/synchronizer/synchronizer.hh b/src/synchronizer/synchronizer.hh
index 47e27a0a6..ab305e03a 100644
--- a/src/synchronizer/synchronizer.hh
+++ b/src/synchronizer/synchronizer.hh
@@ -1,172 +1,173 @@
 /**
  * @file   synchronizer.hh
  *
  * @author Guillaume Anciaux <guillaume.anciaux@epfl.ch>
  * @author Nicolas Richart <nicolas.richart@epfl.ch>
  * @author Aurelia Cuba Ramos <aurelia.cubaramos@epfl.ch>
  *
  * @date creation: Wed Sep 01 2010
  * @date last modification: Tue Apr 30 2013
  *
  * @brief  interface for communicator and pbc synchronizers
  *
  * @section LICENSE
  *
  * Copyright (©) 2010-2012, 2014 EPFL (Ecole Polytechnique Fédérale de Lausanne)
  * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
  *
  * Akantu is free  software: you can redistribute it and/or  modify it under the
  * terms  of the  GNU Lesser  General Public  License as  published by  the Free
  * Software Foundation, either version 3 of the License, or (at your option) any
  * later version.
  *
  * Akantu is  distributed in the  hope that it  will be useful, but  WITHOUT ANY
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A  PARTICULAR PURPOSE. See  the GNU  Lesser General  Public License  for more
  * details.
  *
  * You should  have received  a copy  of the GNU  Lesser General  Public License
  * along with Akantu. If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 /* -------------------------------------------------------------------------- */
 
 #ifndef __AKANTU_SYNCHRONIZER_HH__
 #define __AKANTU_SYNCHRONIZER_HH__
 
 /* -------------------------------------------------------------------------- */
 #include "aka_memory.hh"
 #include "data_accessor.hh"
 #include "real_static_communicator.hh"
 #include "static_communicator.hh"
 
 /* -------------------------------------------------------------------------- */
 #include <map>
 /* -------------------------------------------------------------------------- */
 
 __BEGIN_AKANTU__
 
 class Synchronizer : protected Memory {
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 public:
 
   Synchronizer(SynchronizerID id = "synchronizer", MemoryID memory_id = 0);
 
   virtual ~Synchronizer() { };
 
   virtual void printself(__attribute__((unused)) std::ostream & stream,
 			 __attribute__((unused)) int indent = 0) const {};
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
 
   /// synchronize ghosts
   void synchronize(DataAccessor & data_accessor,SynchronizationTag tag);
 
   /// asynchronous synchronization of ghosts
   virtual void asynchronousSynchronize(DataAccessor & data_accessor,SynchronizationTag tag) = 0;
 
   /// wait end of asynchronous synchronization of ghosts
   virtual void waitEndSynchronize(DataAccessor & data_accessor,SynchronizationTag tag) = 0;
 
   /// compute buffer size for a given tag and data accessor
   virtual void computeBufferSize(DataAccessor & data_accessor, SynchronizationTag tag)=0;
 
   /**
    * tag = |__________20_________|___8____|_4_|
    *       |          proc       | num mes| ct|
    */
   class Tag {
   public:
     Tag() : tag(0) {}
     Tag(int val) : tag(val) {}
 
     operator int() { return int(tag); } // remove the sign bit
 
     template<typename CommTag>
     static inline Tag genTag(int proc, UInt msg_count, CommTag tag) {
       Tag t;
       t.tag = (((proc & 0xFFFFF) << 12) + ((msg_count & 0xFF) << 4) + ((Int)tag & 0xF));
       return t;
     }
 
     virtual void printself(std::ostream & stream,
 			   __attribute__((unused)) int indent = 0) const {
       stream << (tag >> 12) << ":" << (tag >> 4 & 0xFF) << ":" << (tag & 0xF);
     }
   private:
     int tag;
   };
 
   template<typename CommTag>
+  /// generate the tag from the ID
   inline Tag genTagFromID(CommTag tag) {
     Tag t(std::abs((int(hash<std::string>(this->getID())) << 4) + (tag & 0xF)));
     return t;
   }
 
 protected:
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
 
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 protected:
 
   class Communication {
   public:
     void resize(UInt size) {
       send_buffer.resize(size);
       recv_buffer.resize(size);
       size_to_send   .resize(size);
       size_to_receive.resize(size);
     }
 
   public:
     /// size of data to send to each processor
     std::vector<UInt> size_to_send;
     /// size of data to recv to each processor
     std::vector<UInt> size_to_receive;
     std::vector< CommunicationBuffer > send_buffer;
     std::vector< CommunicationBuffer > recv_buffer;
 
     std::vector<CommunicationRequest *> send_requests;
     std::vector<CommunicationRequest *> recv_requests;
   };
 
   /// id of the synchronizer
   SynchronizerID id;
 
   /// message counter per tag
   std::map<SynchronizationTag, UInt> tag_counter;
 
 
   /// the static memory instance
   StaticCommunicator * static_communicator;
 };
 
 
 /// standard output stream operator
 inline std::ostream & operator <<(std::ostream & stream, const Synchronizer & _this)
 {
   _this.printself(stream);
   return stream;
 }
 
 inline std::ostream & operator <<(std::ostream & stream, const Synchronizer::Tag & _this)
 {
   _this.printself(stream);
   return stream;
 }
 
 
 __END_AKANTU__
 
 #endif /* __AKANTU_SYNCHRONIZER_HH__ */