diff --git a/doc/manual/manual-io.tex b/doc/manual/manual-io.tex
index 03fbb5f3f..00235b699 100644
--- a/doc/manual/manual-io.tex
+++ b/doc/manual/manual-io.tex
@@ -1,110 +1,110 @@
 
 \chapter{Input/Output}\index{I\/O}
 
 \section{Generic data}
 In this chapter, we address ways to get the internal data in human-readable formats.
 The models in \akantu handle data associated to the
 mesh, but this data can be split into several \code{Arrays}. For example, the
 data stored per element type in a \code{ElementTypeMapArray} is composed of as
 many \code{Array}s as types in the mesh.
 
 In order to get this data in a visualization software, the models contain a
 object to dump \code{VTK} files. These files can be visualized in software such
 as \code{ParaView}\cite{paraview}, \code{ViSit}\cite{visit} or \code{Mayavi}\cite{mayavi}.
 
 The internal dumper of the model can be configured to specify which data fields
 are to be written. This is done with the
 \code{addDumpField}\index{I\/O!addDumpField} method. By default all the files
 are generated in a folder called \code{paraview/}
 
 \begin{cpp}
   model.setBaseName("output"); // prefix for all generated files
 
   model.addDumpField("displacement");
   model.addDumpField("stress");
   ...
 
   model.dump()
 \end{cpp}
 
 The fields are dumped with the number of components of the memory. For example, in 2D, the memory has 
 \code{Vector}s of 2 components, or the $2^{nd}$ order tensors with $2\times2$ components.  
 This memory can be dealt with \code{addDumpFieldVector}\index{I\/O!addDumpFieldVector} which always dumps
 \code{Vector}s with 3 components or \code{addDumpFieldTensor}\index{I\/O!addDumpFieldTensor} which dumps $2^{nd}$
 order tensors with $3\times3$ components respectively. The routines \code{addDumpFieldVector}\index{I\/O!addDumpFieldVector} and
 \code{addDumpFieldTensor}\index{I\/O!addDumpFieldTensor} were introduced because of Paraview which mostly manipulate 3D 
 data.
 
 Those fields which are stored by quadrature point are modified to be seen in the
 \code{VTK} file as elemental data. To do this, the default is to average the
 values of all the quadrature points.
 
 The list of fields depends on the models (for
 \code{SolidMechanicsModel} see table~\ref{tab:io:smm_field_list}).
 
 \begin{table}
   \centering
   \begin{tabular}{llll}
     \toprule
     key          &    type      & support \\
     \midrule
     displacement & Vector<Real> & nodes  \\
     velocity     & Vector<Real> & nodes  \\
     acceleration & Vector<Real> & nodes  \\
     force	       & Vector<Real> & nodes  \\
     residual     & Vector<Real> & nodes  \\
     boundary     & Vector<bool> & nodes  \\
     mass         & Vector<Real> & nodes  \\
     partitions   & Real         & elements \\
     stress & Matrix<Real> & quadrature points  \\
     Von Mises stress & Real & quadrature points  \\
-    grad_u & Matrix<Real> & quadrature points  \\
+    grad\_u & Matrix<Real> & quadrature points  \\
     strain & Matrix<Real> & quadrature points  \\
     principal strain & Vector<Real> & quadrature points  \\
     Green strain & Matrix<Real> & quadrature points  \\
     principal Green strain & Vector<Real> & quadrature points  \\
     \textit{material internals} & variable  & quadrature points  \\
     \bottomrule
   \end{tabular}
   \caption{List of dumpable fields for \code{SolidMechanicsModel}.}
   \label{tab:io:smm_field_list}
 \end{table}
 
 The user can also register external fields which have the same mesh as the mesh from the model as support. To do this, an object of type \code{Field} has to be created.\index{I\/O!addDumpFieldExternal}
 
 \begin{itemize}
 \item For nodal fields :
 \begin{cpp}
   Vector<T> vect(nb_nodes, nb_component);
   Field field = new DumperIOHelper::NodalField<T>(vect));
   model.addDumpFieldExternal("my_field", field);
 \end{cpp}
 
 \item For elemental fields :
 \begin{cpp}
   ElementTypeMapArray<T> arr;
   Field field = new DumperIOHelper::ElementalField<T>(arr, spatial_displacement));
   model.addDumpFieldExternal("my_field", field);
 \end{cpp}
 \end{itemize}
 
 \section{Cohesive elements' data}
 Cohesive elements and their relative data can be easily dumped thanks
 to a specific dumper contained in
 \code{SolidMechanicsModelCohesive}. In order to use it, one has just
 to add the string \code{"cohesive elements"} when calling each method
 already illustrated. Here is an example on how to dump displacement
 and damage:
 \begin{cpp}
   model.setBaseNameToDumper("cohesive elements", "cohesive_elements_output");
   model.addDumpFieldVectorToDumper("cohesive elements", "displacement");
   model.addDumpFieldToDumper("cohesive elements", "damage");
   ...
 
   model.dump("cohesive elements");
 \end{cpp}
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "manual"
 %%% End: 
diff --git a/extra_packages/parallel-cohesive-element b/extra_packages/parallel-cohesive-element
index c46ced178..816a3f911 160000
--- a/extra_packages/parallel-cohesive-element
+++ b/extra_packages/parallel-cohesive-element
@@ -1 +1 @@
-Subproject commit c46ced1786aec62d4e082dd3624eb539a96413f4
+Subproject commit 816a3f9116847551ae2041cab5d8be11ba6435e5
diff --git a/src/model/solid_mechanics/materials/material_cohesive/constitutive_laws/material_cohesive_linear.cc b/src/model/solid_mechanics/materials/material_cohesive/constitutive_laws/material_cohesive_linear.cc
index 0b6c0c2cd..ab360b2d9 100644
--- a/src/model/solid_mechanics/materials/material_cohesive/constitutive_laws/material_cohesive_linear.cc
+++ b/src/model/solid_mechanics/materials/material_cohesive/constitutive_laws/material_cohesive_linear.cc
@@ -1,694 +1,693 @@
 /**
  * @file   material_cohesive_linear.cc
  *
  * @author Marco Vocialta <marco.vocialta@epfl.ch>
  *
  * @date creation: Tue May 08 2012
  * @date last modification: Thu Aug 07 2014
  *
  * @brief  Linear irreversible cohesive law of mixed mode loading with
  * random stress definition for extrinsic type
  *
  * @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 <numeric>
 
 /* -------------------------------------------------------------------------- */
 #include "material_cohesive_linear.hh"
 #include "solid_mechanics_model_cohesive.hh"
 #include "sparse_matrix.hh"
 #include "dof_synchronizer.hh"
 
 __BEGIN_AKANTU__
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 MaterialCohesiveLinear<spatial_dimension>::MaterialCohesiveLinear(SolidMechanicsModel & model,
                                                                   const ID & id) :
   MaterialCohesive(model,id),
   sigma_c_eff("sigma_c_eff", *this),
   delta_c_eff("delta_c_eff", *this),
   insertion_stress("insertion_stress", *this) {
   AKANTU_DEBUG_IN();
 
   this->registerParam("beta"   , beta   , 0. ,
                       _pat_parsable | _pat_readable,
                       "Beta parameter"         );
 
   this->registerParam("G_c"   , G_c   , 0. ,
                       _pat_parsable | _pat_readable,
                       "Mode I fracture energy" );
 
   this->registerParam("penalty", penalty, 0. ,
                       _pat_parsable | _pat_readable,
                       "Penalty coefficient"    );
 
   this->registerParam("volume_s", volume_s, 0. ,
                       _pat_parsable | _pat_readable,
                       "Reference volume for sigma_c scaling");
 
   this->registerParam("m_s", m_s, 1. ,
                       _pat_parsable | _pat_readable,
                       "Weibull exponent for sigma_c scaling");
 
   this->registerParam("kappa"  , kappa  , 1. ,
                       _pat_parsable | _pat_readable,
                       "Kappa parameter");
 
   //  if (!model->isExplicit())
     use_previous_delta_max = true;
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::initMaterial() {
   AKANTU_DEBUG_IN();
 
   MaterialCohesive::initMaterial();
 
   /// compute scalars
   beta2_kappa2 = beta * beta/kappa/kappa;
   beta2_kappa  = beta * beta/kappa;
 
   if (Math::are_float_equal(beta, 0))
     beta2_inv = 0;
   else
     beta2_inv = 1./beta/beta;
 
   sigma_c_eff.initialize(1);
   delta_c_eff.initialize(1);
   insertion_stress.initialize(spatial_dimension);
 
   if (!Math::are_float_equal(delta_c, 0.))
     delta_c_eff.setDefaultValue(delta_c);
   else
     delta_c_eff.setDefaultValue(2 * G_c / sigma_c);
 
   if (model->getIsExtrinsic()) scaleInsertionTraction();
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::scaleInsertionTraction() {
   AKANTU_DEBUG_IN();
 
   // do nothing if volume_s hasn't been specified by the user
   if (Math::are_float_equal(volume_s, 0.)) return;
 
   const Mesh & mesh_facets = model->getMeshFacets();
   const FEEngine & fe_engine = model->getFEEngine();
   const FEEngine & fe_engine_facet = model->getFEEngine("FacetsFEEngine");
 
   // loop over facet type
   Mesh::type_iterator first = mesh_facets.firstType(spatial_dimension - 1);
   Mesh::type_iterator last  = mesh_facets.lastType(spatial_dimension - 1);
 
   Real base_sigma_c = sigma_c;
 
   for(;first != last; ++first) {
     ElementType type_facet = *first;
 
     const Array< std::vector<Element> > & facet_to_element
       = mesh_facets.getElementToSubelement(type_facet);
 
     UInt nb_facet = facet_to_element.getSize();
     UInt nb_quad_per_facet = fe_engine_facet.getNbQuadraturePoints(type_facet);
 
     // iterator to modify sigma_c for all the quadrature points of a facet
     Array<Real>::vector_iterator sigma_c_iterator
       = sigma_c(type_facet).begin_reinterpret(nb_quad_per_facet, nb_facet);
 
     for (UInt f = 0; f < nb_facet; ++f, ++sigma_c_iterator) {
 
       const std::vector<Element> & element_list = facet_to_element(f);
 
       // compute bounding volume
       Real volume = 0;
 
       std::vector<Element>::const_iterator elem = element_list.begin();
       std::vector<Element>::const_iterator elem_end = element_list.end();
 
       for (; elem != elem_end; ++elem) {
         if (*elem == ElementNull) continue;
 
         // unit vector for integration in order to obtain the volume
         UInt nb_quadrature_points = fe_engine.getNbQuadraturePoints(elem->type);
         Vector<Real> unit_vector(nb_quadrature_points, 1);
 
         volume += fe_engine.integrate(unit_vector, elem->type,
                                       elem->element, elem->ghost_type);
       }
 
       // scale sigma_c
       *sigma_c_iterator -= base_sigma_c;
       *sigma_c_iterator *= std::pow(volume_s / volume, 1. / m_s);
       *sigma_c_iterator += base_sigma_c;
     }
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::checkInsertion() {
   AKANTU_DEBUG_IN();
 
   const Mesh & mesh_facets = model->getMeshFacets();
   CohesiveElementInserter & inserter = model->getElementInserter();
 
   Real tolerance = Math::getTolerance();
 
   Mesh::type_iterator it   = mesh_facets.firstType(spatial_dimension - 1);
   Mesh::type_iterator last = mesh_facets.lastType(spatial_dimension - 1);
 
   for (; it != last; ++it) {
     ElementType type_facet = *it;
     ElementType type_cohesive = FEEngine::getCohesiveElementType(type_facet);
     const Array<bool> & facets_check = inserter.getCheckFacets(type_facet);
     Array<bool> & f_insertion = inserter.getInsertionFacets(type_facet);
     Array<UInt> & f_filter = facet_filter(type_facet);
     Array<Real> & sig_c_eff = sigma_c_eff(type_cohesive);
     Array<Real> & del_c = delta_c_eff(type_cohesive);
     Array<Real> & ins_stress = insertion_stress(type_cohesive);
     Array<Real> & trac_old = tractions_old(type_cohesive);
     const Array<Real> & f_stress = model->getStressOnFacets(type_facet);
     const Array<Real> & sigma_lim = sigma_c(type_facet);
     Real max_ratio = 0.;
     UInt index_f = 0;
     UInt index_filter = 0;
     UInt nn = 0;
 
 
     UInt nb_quad_facet = model->getFEEngine("FacetsFEEngine").getNbQuadraturePoints(type_facet);
     UInt nb_facet = f_filter.getSize();
     if (nb_facet == 0) continue;
 
     Array<Real>::const_iterator<Real> sigma_lim_it = sigma_lim.begin();
 
     Matrix<Real> stress_tmp(spatial_dimension, spatial_dimension);
     Matrix<Real> normal_traction(spatial_dimension, nb_quad_facet);
     Vector<Real> stress_check(nb_quad_facet);
     UInt sp2 = spatial_dimension * spatial_dimension;
 
     const Array<Real> & tangents = model->getTangents(type_facet);
     const Array<Real> & normals
       = model->getFEEngine("FacetsFEEngine").getNormalsOnQuadPoints(type_facet);
     Array<Real>::const_vector_iterator normal_begin = normals.begin(spatial_dimension);
     Array<Real>::const_vector_iterator tangent_begin = tangents.begin(tangents.getNbComponent());
     Array<Real>::const_matrix_iterator facet_stress_begin =
       f_stress.begin(spatial_dimension, spatial_dimension * 2);
 
     std::vector<Real> new_sigmas;
     std::vector< Vector<Real> > new_normal_traction;
     std::vector<Real> new_delta_c;
 
     // loop over each facet belonging to this material
     for (UInt f = 0; f < nb_facet; ++f, ++sigma_lim_it) {
       UInt facet = f_filter(f);
       // skip facets where check shouldn't be realized
       if (!facets_check(facet)) continue;
 
       // compute the effective norm on each quadrature point of the facet
       for (UInt q = 0; q < nb_quad_facet; ++q) {
 	UInt current_quad = facet * nb_quad_facet + q;
 	const Vector<Real> & normal = normal_begin[current_quad];
 	const Vector<Real> & tangent = tangent_begin[current_quad];
 	const Matrix<Real> & facet_stress_it = facet_stress_begin[current_quad];
 
 	// compute average stress on the current quadrature point
 	Matrix<Real> stress_1(facet_stress_it.storage(),
 			      spatial_dimension,
 			      spatial_dimension);
 
 	Matrix<Real> stress_2(facet_stress_it.storage() + sp2,
 			      spatial_dimension,
 			      spatial_dimension);
 
 	stress_tmp.copy(stress_1);
 	stress_tmp += stress_2;
 	stress_tmp /= 2.;
 
 	Vector<Real> normal_traction_vec(normal_traction(q));
 
 	// compute normal and effective stress
 	stress_check(q) = computeEffectiveNorm(stress_tmp, normal, tangent,
 					       normal_traction_vec);
       }
 
       // verify if the effective stress overcomes the threshold
       if (stress_check.mean() > (*sigma_lim_it - tolerance)) {
 
         if (model->isExplicit()){
           f_insertion(facet) = true;
 
           // store the new cohesive material parameters for each quadrature point
           for (UInt q = 0; q < nb_quad_facet; ++q) {
             Real new_sigma = stress_check(q);
             Vector<Real> normal_traction_vec(normal_traction(q));
 
             if (spatial_dimension != 3)
               normal_traction_vec *= -1.;
 
             new_sigmas.push_back(new_sigma);
             new_normal_traction.push_back(normal_traction_vec);
 
             Real new_delta;
 
             // set delta_c in function of G_c or a given delta_c value
             if (Math::are_float_equal(delta_c, 0.))
               new_delta = 2 * G_c / new_sigma;
             else
               new_delta = (*sigma_lim_it) / new_sigma * delta_c;
 
             new_delta_c.push_back(new_delta);
           }
 
         }else{
           Real ratio = stress_check.mean()/(*sigma_lim_it);
           if (ratio > max_ratio){
             ++nn;
             max_ratio = ratio;
             index_f = f;
             index_filter = f_filter(f);
           }
         }
       }
     }
 
     /// insertion of only 1 cohesive element in case of implicit approach. The one subjected to the highest stress.
     if (!model->isExplicit()){
       StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator();
       Array<Real> abs_max(comm.getNbProc());
       abs_max(comm.whoAmI()) = max_ratio;
       comm.allGather(abs_max.storage(), 1);
 
       Array<Real>::scalar_iterator it = std::max_element(abs_max.begin(), abs_max.end());
       Int pos = it - abs_max.begin();
 
       if (pos != comm.whoAmI()) {
       	AKANTU_DEBUG_OUT();
       	return;
       }
 
       if (nn) {
 	f_insertion(index_filter) = true;
 
 	//  Array<Real>::iterator<Matrix<Real> > normal_traction_it =
 	//  normal_traction.begin_reinterpret(nb_quad_facet, spatial_dimension, nb_facet);
 	Array<Real>::const_iterator<Real> sigma_lim_it = sigma_lim.begin();
 
 	for (UInt q = 0; q < nb_quad_facet; ++q) {
 
 	  //  Vector<Real> ins_s(normal_traction_it[index_f].storage() + q * spatial_dimension,
 	  //            spatial_dimension);
 
 	  Real new_sigma = (sigma_lim_it[index_f]);
 
 	  new_sigmas.push_back(new_sigma);
 	  new_normal_traction.push_back(0.0);
 
 	  Real new_delta;
 
 	  //set delta_c in function of G_c or a given delta_c value
 	  if (!Math::are_float_equal(delta_c, 0.))
 	    new_delta = delta_c;
 	  else
 	    new_delta = 2 * G_c / (new_sigma);
 
 	  new_delta_c.push_back(new_delta);
 
 	}
       }
     }
 
     // update material data for the new elements
     UInt old_nb_quad_points = sig_c_eff.getSize();
     UInt new_nb_quad_points = new_sigmas.size();
     sig_c_eff.resize(old_nb_quad_points + new_nb_quad_points);
     ins_stress.resize(old_nb_quad_points + new_nb_quad_points);
     trac_old.resize(old_nb_quad_points + new_nb_quad_points);
     del_c.resize(old_nb_quad_points + new_nb_quad_points);
 
     for (UInt q = 0; q < new_nb_quad_points; ++q) {
       sig_c_eff(old_nb_quad_points + q) = new_sigmas[q];
       del_c(old_nb_quad_points + q) = new_delta_c[q];
       for (UInt dim = 0; dim < spatial_dimension; ++dim) {
  	ins_stress(old_nb_quad_points + q, dim) = new_normal_traction[q](dim);
  	trac_old(old_nb_quad_points + q, dim) = new_normal_traction[q](dim);
       }
     }
   }
 
    AKANTU_DEBUG_OUT();
  }
 
 /* -------------------------------------------------------------------------- */
-template<UInt spatial_dimension>
-inline Real MaterialCohesiveLinear<spatial_dimension>::computeEffectiveNorm(const Matrix<Real> & stress,
-									    const Vector<Real> & normal,
-									    const Vector<Real> & tangent,
-									    Vector<Real> & normal_traction) {
+template<UInt dim>
+inline Real MaterialCohesiveLinear<dim>::computeEffectiveNorm(const Matrix<Real> & stress,
+							      const Vector<Real> & normal,
+							      const Vector<Real> & tangent,
+							      Vector<Real> & normal_traction) {
   normal_traction.mul<false>(stress, normal);
 
   Real normal_contrib = normal_traction.dot(normal);
 
   /// in 3D tangential components must be summed
   Real tangent_contrib = 0;
 
-  if (spatial_dimension == 2) {
+  if (dim == 2) {
     Real tangent_contrib_tmp = normal_traction.dot(tangent);
     tangent_contrib += tangent_contrib_tmp * tangent_contrib_tmp;
   }
-  else if (spatial_dimension == 3) {
-    for (UInt s = 0; s < spatial_dimension - 1; ++s) {
-      const Vector<Real> tangent_v(tangent.storage() + s * spatial_dimension,
-                                   spatial_dimension);
+  else if (dim == 3) {
+    for (UInt s = 0; s < dim - 1; ++s) {
+      const Vector<Real> tangent_v(tangent.storage() + s * dim, dim);
       Real tangent_contrib_tmp = normal_traction.dot(tangent_v);
       tangent_contrib += tangent_contrib_tmp * tangent_contrib_tmp;
     }
   }
 
   tangent_contrib = std::sqrt(tangent_contrib);
   normal_contrib = std::max(0., normal_contrib);
 
   return std::sqrt(normal_contrib * normal_contrib + tangent_contrib * tangent_contrib * beta2_inv);
 }
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::computeTraction(const Array<Real> & normal,
                                                                 ElementType el_type,
                                                                 GhostType ghost_type) {
   AKANTU_DEBUG_IN();
 
   /// define iterators
   Array<Real>::iterator< Vector<Real> > traction_it =
     tractions(el_type, ghost_type).begin(spatial_dimension);
 
   Array<Real>::iterator< Vector<Real> > opening_it =
     opening(el_type, ghost_type).begin(spatial_dimension);
 
   Array<Real>::iterator< Vector<Real> > contact_traction_it =
     contact_tractions(el_type, ghost_type).begin(spatial_dimension);
 
   Array<Real>::iterator< Vector<Real> > contact_opening_it =
     contact_opening(el_type, ghost_type).begin(spatial_dimension);
 
   Array<Real>::const_iterator< Vector<Real> > normal_it =
     normal.begin(spatial_dimension);
 
   Array<Real>::iterator< Vector<Real> >traction_end =
     tractions(el_type, ghost_type).end(spatial_dimension);
 
   Array<Real>::iterator<Real>sigma_c_it =
     sigma_c_eff(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>delta_max_it =
     delta_max(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>delta_max_prev_it =
     delta_max.previous(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>delta_c_it =
     delta_c_eff(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>damage_it =
     damage(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Vector<Real> > insertion_stress_it =
     insertion_stress(el_type, ghost_type).begin(spatial_dimension);
 
 
   Real * memory_space = new Real[2*spatial_dimension];
   Vector<Real> normal_opening(memory_space, spatial_dimension);
   Vector<Real> tangential_opening(memory_space + spatial_dimension,
                                   spatial_dimension);
 
   /// loop on each quadrature point
   for (; traction_it != traction_end;
        ++traction_it, ++opening_it, ++normal_it, ++sigma_c_it,
          ++delta_max_it, ++delta_c_it, ++damage_it, ++contact_traction_it,
          ++insertion_stress_it, ++contact_opening_it, ++delta_max_prev_it) {
 
     if (!model->isExplicit())
       *delta_max_it = *delta_max_prev_it;
 
     /// compute normal and tangential opening vectors
     Real normal_opening_norm = opening_it->dot(*normal_it);
     normal_opening  = (*normal_it);
     normal_opening *= normal_opening_norm;
 
     tangential_opening  = *opening_it;
     tangential_opening -=  normal_opening;
 
     Real tangential_opening_norm = tangential_opening.norm();
 
     /**
      * compute effective opening displacement
      * @f$ \delta = \sqrt{
      * \frac{\beta^2}{\kappa^2} \Delta_t^2 + \Delta_n^2 } @f$
      */
     Real delta = tangential_opening_norm * tangential_opening_norm * beta2_kappa2;
 
     bool penetration = normal_opening_norm < -Math::getTolerance();
 
     if (penetration) {
       /// use penalty coefficient in case of penetration
       *contact_traction_it = normal_opening;
       *contact_traction_it *= penalty;
       *contact_opening_it = normal_opening;
       /// don't consider penetration contribution for delta
       *opening_it = tangential_opening;
       normal_opening.clear();
     }
     else {
       delta += normal_opening_norm * normal_opening_norm;
       contact_traction_it->clear();
       contact_opening_it->clear();
     }
 
     delta = std::sqrt(delta);
 
     /// update maximum displacement and damage
     *delta_max_it = std::max(*delta_max_it, delta);
     *damage_it = std::min(*delta_max_it / *delta_c_it, 1.);
 
     /**
      * Compute traction @f$ \mathbf{T} = \left(
      * \frac{\beta^2}{\kappa} \Delta_t \mathbf{t} + \Delta_n
      * \mathbf{n} \right) \frac{\sigma_c}{\delta} \left( 1-
      * \frac{\delta}{\delta_c} \right)@f$
      */
 
     if (Math::are_float_equal(*damage_it, 1.))
       traction_it->clear();
     else if (Math::are_float_equal(*damage_it, 0.)) {
       if (penetration)
         traction_it->clear();
       else
         *traction_it = *insertion_stress_it;
     }
     else {
       *traction_it  = tangential_opening;
       *traction_it *= beta2_kappa;
       *traction_it += normal_opening;
 
       AKANTU_DEBUG_ASSERT(*delta_max_it != 0.,
                           "Division by zero, tolerance might be too low");
 
       *traction_it *= *sigma_c_it / *delta_max_it * (1. - *damage_it);
 
     }
   }
 
   delete [] memory_space;
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::checkDeltaMax(GhostType ghost_type) {
   AKANTU_DEBUG_IN();
 
   Mesh & mesh = fem_cohesive->getMesh();
   Mesh::type_iterator it = mesh.firstType(spatial_dimension,
 					  ghost_type, _ek_cohesive);
   Mesh::type_iterator last_type = mesh.lastType(spatial_dimension,
 						ghost_type, _ek_cohesive);
 
   for(; it != last_type; ++it) {
     Array<UInt> & elem_filter = element_filter(*it, ghost_type);
 
     UInt nb_element = elem_filter.getSize();
     if (nb_element == 0) continue;
 
     ElementType el_type = *it;
 
     /// define iterators
     Array<Real>::iterator<Real>delta_max_it =
       delta_max(el_type, ghost_type).begin();
 
     Array<Real>::iterator<Real>delta_max_end =
       delta_max(el_type, ghost_type).end();
 
     Array<Real>::iterator<Real>delta_max_prev_it =
       delta_max.previous(el_type, ghost_type).begin();
 
     Array<Real>::iterator<Real>delta_c_it =
       delta_c_eff(el_type, ghost_type).begin();
 
 
     /// loop on each quadrature point
     for (; delta_max_it != delta_max_end;
          ++delta_max_it, ++delta_max_prev_it, ++delta_c_it) {
 
       if (*delta_max_prev_it == 0)
         *delta_max_it = *delta_c_it / 1000;
       else
         *delta_max_it = *delta_max_prev_it;
 
     }
   }
 
   //  delete [] memory_space;
 }
 
 
 /* -------------------------------------------------------------------------- */
 template<UInt spatial_dimension>
 void MaterialCohesiveLinear<spatial_dimension>::computeTangentTraction(const ElementType & el_type,
                                                                        Array<Real> & tangent_matrix,
                                                                        const Array<Real> & normal,
                                                                        GhostType ghost_type) {
   AKANTU_DEBUG_IN();
 
   /// define iterators
   Array<Real>::matrix_iterator tangent_it =
     tangent_matrix.begin(spatial_dimension, spatial_dimension);
 
   Array<Real>::matrix_iterator tangent_end =
     tangent_matrix.end(spatial_dimension, spatial_dimension);
 
   Array<Real>::const_vector_iterator normal_it =
     normal.begin(spatial_dimension);
 
   Array<Real>::vector_iterator opening_it =
     opening(el_type, ghost_type).begin(spatial_dimension);
 
   Array<Real>::iterator<Real>delta_max_it =
     delta_max.previous(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>sigma_c_it =
     sigma_c_eff(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>delta_c_it =
     delta_c_eff(el_type, ghost_type).begin();
 
   Array<Real>::iterator<Real>damage_it =
     damage(el_type, ghost_type).begin();
 
   Array<Real>::iterator< Vector<Real> > contact_opening_it =
     contact_opening(el_type, ghost_type).begin(spatial_dimension);
 
   Vector<Real> normal_opening(spatial_dimension);
   Vector<Real> tangential_opening(spatial_dimension);
 
   for (; tangent_it != tangent_end;
        ++tangent_it, ++normal_it, ++opening_it, ++ delta_max_it,
          ++sigma_c_it, ++delta_c_it, ++damage_it, ++contact_opening_it) {
 
     /// compute normal and tangential opening vectors
     *opening_it += *contact_opening_it;
     Real normal_opening_norm = opening_it->dot(*normal_it);
     normal_opening = (*normal_it);
     normal_opening *= normal_opening_norm;
 
     tangential_opening = *opening_it;
     tangential_opening -= normal_opening;
 
     Real tangential_opening_norm = tangential_opening.norm();
 
     bool penetration = normal_opening_norm < -Math::getTolerance();
 
     Real derivative = 0;
     Real t = 0;
 
     Real delta = tangential_opening_norm * tangential_opening_norm * beta2_kappa2;
     delta += normal_opening_norm * normal_opening_norm;
     delta = std::sqrt(delta);
 
     if (delta < Math::getTolerance())
       delta = (*delta_c_it)/1000.;  //0.0000001;
 
     if (normal_opening_norm >= 0.0){
       if (delta >= *delta_max_it){
         derivative = -*sigma_c_it/(delta * delta);
         t = *sigma_c_it * (1 - delta / *delta_c_it);
       }	else if (delta < *delta_max_it){
         Real tmax = *sigma_c_it * (1 - *delta_max_it / *delta_c_it);
         t = tmax / *delta_max_it * delta;
       }
     }
 
     Matrix<Real> n_outer_n(spatial_dimension, spatial_dimension);
     n_outer_n.outerProduct(*normal_it, *normal_it);
 
     if (penetration){
       ///don't consider penetration contribution for delta
       *opening_it = tangential_opening;
       *tangent_it += n_outer_n;
       *tangent_it *= penalty;
     }
 
     Matrix<Real> I(spatial_dimension, spatial_dimension);
     I.eye(beta2_kappa);
     Matrix<Real> nn(n_outer_n);
     nn *= (1 - beta2_kappa);
     nn += I;
     nn *= t/delta;
     Vector<Real> t_tilde(normal_opening);
     t_tilde *= (1 - beta2_kappa2);
     Vector<Real> mm(*opening_it);
     mm *= beta2_kappa2;
     t_tilde += mm;
     Vector<Real> t_hat(normal_opening);
     t_hat += beta2_kappa * tangential_opening;
     Matrix<Real> prov(spatial_dimension, spatial_dimension);
     prov.outerProduct(t_hat, t_tilde);
     prov *= derivative/delta;
     prov += nn;
     *tangent_it += prov;
 
   }
   AKANTU_DEBUG_OUT();
 }
 /* -------------------------------------------------------------------------- */
 
 
 INSTANSIATE_MATERIAL(MaterialCohesiveLinear);
 
 __END_AKANTU__
diff --git a/src/model/solid_mechanics/solid_mechanics_model_cohesive.cc b/src/model/solid_mechanics/solid_mechanics_model_cohesive.cc
index 8d75e87f5..e418083d0 100644
--- a/src/model/solid_mechanics/solid_mechanics_model_cohesive.cc
+++ b/src/model/solid_mechanics/solid_mechanics_model_cohesive.cc
@@ -1,704 +1,709 @@
 /**
  * @file   solid_mechanics_model_cohesive.cc
  *
  * @author Marco Vocialta <marco.vocialta@epfl.ch>
  * @author Nicolas Richart <nicolas.richart@epfl.ch>
  *
  * @date creation: Tue May 08 2012
  * @date last modification: Fri Sep 05 2014
  *
  * @brief  Solid mechanics model for cohesive elements
  *
  * @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 <algorithm>
 #include "shape_cohesive.hh"
 #include "solid_mechanics_model_cohesive.hh"
 #include "dumpable_inline_impl.hh"
 #include "material_cohesive.hh"
 
 #ifdef AKANTU_USE_IOHELPER
 #  include "dumper_paraview.hh"
 #endif
 
 /* -------------------------------------------------------------------------- */
 
 __BEGIN_AKANTU__
 
 const SolidMechanicsModelCohesiveOptions default_solid_mechanics_model_cohesive_options(_explicit_lumped_mass,
 											false,
 											false);
 
 /* -------------------------------------------------------------------------- */
 
 SolidMechanicsModelCohesive::SolidMechanicsModelCohesive(Mesh & mesh,
 							 UInt dim,
 							 const ID & id,
 							 const MemoryID & memory_id) :
   SolidMechanicsModel(mesh, dim, id, memory_id),
   tangents("tangents", id),
   facet_stress("facet_stress", id),
   facet_material("facet_material", id) {
   AKANTU_DEBUG_IN();
 
   inserter = NULL;
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   facet_synchronizer = NULL;
   facet_stress_synchronizer = NULL;
   cohesive_distributed_synchronizer = NULL;
   global_connectivity = NULL;
 #endif
 
   delete material_selector;
   material_selector = new DefaultMaterialCohesiveSelector(*this);
 
   this->registerEventHandler(*this);
 
 #if defined(AKANTU_USE_IOHELPER)
   this->mesh.registerDumper<DumperParaview>("cohesive elements", id);
   this->mesh.addDumpMeshToDumper("cohesive elements",
 				 mesh, spatial_dimension, _not_ghost, _ek_cohesive);
 #endif
 
   AKANTU_DEBUG_OUT();
 }
 
 
 /* -------------------------------------------------------------------------- */
 SolidMechanicsModelCohesive::~SolidMechanicsModelCohesive() {
   AKANTU_DEBUG_IN();
 
   delete inserter;
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   delete cohesive_distributed_synchronizer;
   delete facet_synchronizer;
   delete facet_stress_synchronizer;
 #endif
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::setTimeStep(Real time_step) {
   SolidMechanicsModel::setTimeStep(time_step);
 
 #if defined(AKANTU_USE_IOHELPER)
   this->mesh.getDumper("cohesive elements").setTimeStep(time_step);
 #endif
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::initFull(const ModelOptions & options) {
   AKANTU_DEBUG_IN();
 
   const SolidMechanicsModelCohesiveOptions & smmc_options =
     dynamic_cast<const SolidMechanicsModelCohesiveOptions &>(options);
 
   this->is_extrinsic = smmc_options.extrinsic;
 
   if (!inserter)
     inserter = new CohesiveElementInserter(mesh, is_extrinsic, synch_parallel,
 					   id+":cohesive_element_inserter");
 
   SolidMechanicsModel::initFull(options);
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   if (facet_synchronizer != NULL)
     inserter->initParallel(facet_synchronizer);
 #endif
 
   if (is_extrinsic)
     initAutomaticInsertion();
 
   AKANTU_DEBUG_OUT();
 }
 
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::initMaterials() {
   AKANTU_DEBUG_IN();
 
   // make sure the material are instantiated
   if(!are_materials_instantiated) instantiateMaterials();
 
   /// find the first cohesive material
   UInt cohesive_index = 0;
 
   while ((dynamic_cast<MaterialCohesive *>(materials[cohesive_index]) == NULL)
 	 && cohesive_index <= materials.size())
     ++cohesive_index;
 
   AKANTU_DEBUG_ASSERT(cohesive_index != materials.size(),
 		      "No cohesive materials in the material input file");
 
   material_selector->setFallback(cohesive_index);
 
   // set the facet information in the material in case of dynamic insertion
   if (is_extrinsic) {
     const Mesh & mesh_facets = inserter->getMeshFacets();
     mesh_facets.initElementTypeMapArray(facet_material, 1, spatial_dimension - 1);
 
     Element element;
     for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) {
       element.ghost_type = *gt;
       Mesh::type_iterator first = mesh_facets.firstType(spatial_dimension - 1, *gt);
       Mesh::type_iterator last  = mesh_facets.lastType(spatial_dimension - 1, *gt);
       for(;first != last; ++first) {
 	element.type = *first;
 	Array<UInt> & f_material = facet_material(*first, *gt);
 	UInt nb_element = mesh_facets.getNbElement(*first, *gt);
 	f_material.resize(nb_element);
 	f_material.set(cohesive_index);
 	for (UInt el = 0; el < nb_element; ++el) {
 	  element.element = el;
 	  UInt mat_index = (*material_selector)(element);
 	  f_material(el) = mat_index;
 	  MaterialCohesive & mat = dynamic_cast<MaterialCohesive &>(*materials[mat_index]);
 	  mat.addFacet(element);
 	}
       }
     }
   } else {
     for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) {
       Mesh::type_iterator first = mesh.firstType(spatial_dimension, *gt, _ek_cohesive);
       Mesh::type_iterator last  = mesh.lastType(spatial_dimension, *gt, _ek_cohesive);
 
       for(;first != last; ++first) {
 	Array<UInt> & mat_indexes = this->material_index(*first, *gt);
 	Array<UInt> & mat_loc_num = this->material_local_numbering(*first, *gt);
 	mat_indexes.set(cohesive_index);
 	mat_loc_num.clear();
       }
     }
   }
 
   SolidMechanicsModel::initMaterials();
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 /**
  * Initialize the model,basically it  pre-compute the shapes, shapes derivatives
  * and jacobian
  *
  */
 void SolidMechanicsModelCohesive::initModel() {
   AKANTU_DEBUG_IN();
 
   SolidMechanicsModel::initModel();
 
   registerFEEngineObject<MyFEEngineCohesiveType>("CohesiveFEEngine", mesh, spatial_dimension);
 
   /// add cohesive type connectivity
   ElementType type = _not_defined;
 
   for (ghost_type_t::iterator gt = ghost_type_t::begin();
        gt != ghost_type_t::end(); ++gt) {
 
     GhostType type_ghost = *gt;
 
     Mesh::type_iterator it   = mesh.firstType(spatial_dimension, type_ghost);
     Mesh::type_iterator last = mesh.lastType(spatial_dimension, type_ghost);
 
     for (; it != last; ++it) {
       const Array<UInt> & connectivity = mesh.getConnectivity(*it, type_ghost);
       if (connectivity.getSize() != 0) {
 	type = *it;
 	ElementType type_facet = Mesh::getFacetType(type);
 	ElementType type_cohesive = FEEngine::getCohesiveElementType(type_facet);
 	mesh.addConnectivityType(type_cohesive, type_ghost);
       }
     }
   }
 
   AKANTU_DEBUG_ASSERT(type != _not_defined, "No elements in the mesh");
 
   getFEEngine("CohesiveFEEngine").initShapeFunctions(_not_ghost);
   getFEEngine("CohesiveFEEngine").initShapeFunctions(_ghost);
 
   registerFEEngineObject<MyFEEngineType>("FacetsFEEngine",
 					 mesh.getMeshFacets(),
 					 spatial_dimension - 1);
 
   if (is_extrinsic) {
     getFEEngine("FacetsFEEngine").initShapeFunctions(_not_ghost);
     getFEEngine("FacetsFEEngine").initShapeFunctions(_ghost);
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::limitInsertion(BC::Axis axis,
 						 Real first_limit,
 						 Real second_limit) {
   AKANTU_DEBUG_IN();
   inserter->setLimit(axis, first_limit, second_limit);
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::insertIntrinsicElements() {
   AKANTU_DEBUG_IN();
   inserter->insertIntrinsicElements();
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::initAutomaticInsertion() {
   AKANTU_DEBUG_IN();
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   if (facet_stress_synchronizer != NULL) {
     DataAccessor * data_accessor = this;
     const ElementTypeMapArray<UInt> & rank_to_element = synch_parallel->getPrankToElement();
 
     facet_stress_synchronizer->updateFacetStressSynchronizer(*inserter,
 							     rank_to_element,
 							     *data_accessor);
   }
 #endif
 
   inserter->getMeshFacets().initElementTypeMapArray(facet_stress,
 						    2 * spatial_dimension * spatial_dimension,
 						    spatial_dimension - 1);
 
   resizeFacetStress();
 
   /// compute normals on facets
   computeNormals();
 
   initStressInterpolation();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::updateAutomaticInsertion() {
   AKANTU_DEBUG_IN();
 
   inserter->limitCheckFacets();
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
     if (facet_stress_synchronizer != NULL) {
       DataAccessor * data_accessor = this;
       const ElementTypeMapArray<UInt> & rank_to_element = synch_parallel->getPrankToElement();
 
       facet_stress_synchronizer->updateFacetStressSynchronizer(*inserter,
 							       rank_to_element,
 							       *data_accessor);
     }
 #endif
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::initStressInterpolation() {
   Mesh & mesh_facets = inserter->getMeshFacets();
 
   /// compute quadrature points coordinates on facets
   Array<Real> & position = mesh.getNodes();
 
   ElementTypeMapArray<Real> quad_facets("quad_facets", id);
   mesh_facets.initElementTypeMapArray(quad_facets,
 				     spatial_dimension, spatial_dimension - 1);
 
   getFEEngine("FacetsFEEngine").interpolateOnQuadraturePoints(position, quad_facets);
 
   /// compute elements quadrature point positions and build
   /// element-facet quadrature points data structure
   ElementTypeMapArray<Real> elements_quad_facets("elements_quad_facets", id);
 
   mesh.initElementTypeMapArray(elements_quad_facets,
 			      spatial_dimension,
 			      spatial_dimension);
 
   for (ghost_type_t::iterator gt = ghost_type_t::begin();
        gt != ghost_type_t::end(); ++gt) {
 
     GhostType elem_gt = *gt;
 
     Mesh::type_iterator it   = mesh.firstType(spatial_dimension, elem_gt);
     Mesh::type_iterator last = mesh.lastType(spatial_dimension, elem_gt);
 
     for (; it != last; ++it) {
       ElementType type = *it;
       UInt nb_element = mesh.getNbElement(type, elem_gt);
       if (nb_element == 0) continue;
 
       /// compute elements' quadrature points and list of facet
       /// quadrature points positions by element
       Array<Element> & facet_to_element = mesh_facets.getSubelementToElement(type,
 									     elem_gt);
       UInt nb_facet_per_elem = facet_to_element.getNbComponent();
 
       Array<Real> & el_q_facet = elements_quad_facets(type, elem_gt);
 
       ElementType facet_type = Mesh::getFacetType(type);
 
       UInt nb_quad_per_facet =
 	getFEEngine("FacetsFEEngine").getNbQuadraturePoints(facet_type);
 
       el_q_facet.resize(nb_element * nb_facet_per_elem * nb_quad_per_facet);
 
       for (UInt el = 0; el < nb_element; ++el) {
 	for (UInt f = 0; f < nb_facet_per_elem; ++f) {
 	  Element global_facet_elem = facet_to_element(el, f);
 	  UInt global_facet = global_facet_elem.element;
 	  GhostType facet_gt = global_facet_elem.ghost_type;
 	  const Array<Real> & quad_f = quad_facets(facet_type, facet_gt);
 
 	  for (UInt q = 0; q < nb_quad_per_facet; ++q) {
 	    for (UInt s = 0; s < spatial_dimension; ++s) {
 	      el_q_facet(el * nb_facet_per_elem * nb_quad_per_facet
 			 + f * nb_quad_per_facet + q, s)
 		= quad_f(global_facet * nb_quad_per_facet + q, s);
 	    }
 	  }
 	}
       }
     }
   }
 
   /// loop over non cohesive materials
   for (UInt m = 0; m < materials.size(); ++m) {
     try {
       MaterialCohesive & mat __attribute__((unused)) =
 	dynamic_cast<MaterialCohesive &>(*materials[m]);
     } catch(std::bad_cast&) {
       /// initialize the interpolation function
       materials[m]->initElementalFieldInterpolation(elements_quad_facets);
     }
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::updateResidual(bool need_initialize) {
   AKANTU_DEBUG_IN();
 
   if (need_initialize) initializeUpdateResidualData();
 
   // f -= fint
   std::vector<Material *>::iterator mat_it;
   for(mat_it = materials.begin(); mat_it != materials.end(); ++mat_it) {
     try {
       MaterialCohesive & mat = dynamic_cast<MaterialCohesive &>(**mat_it);
       mat.computeTraction(_not_ghost);
     } catch (std::bad_cast & bce) { }
   }
 
   SolidMechanicsModel::updateResidual(false);
 
   for(mat_it = materials.begin(); mat_it != materials.end(); ++mat_it) {
     try {
       MaterialCohesive & mat = dynamic_cast<MaterialCohesive &>(**mat_it);
       mat.computeEnergies();
     } catch (std::bad_cast & bce) { }
   }
 
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::computeNormals() {
   AKANTU_DEBUG_IN();
 
   Mesh & mesh_facets = inserter->getMeshFacets();
   getFEEngine("FacetsFEEngine").computeNormalsOnControlPoints(_not_ghost);
 
   /**
    *  @todo store tangents while computing normals instead of
    *  recomputing them as follows:
    */
   /* ------------------------------------------------------------------------ */
   UInt tangent_components = spatial_dimension * (spatial_dimension - 1);
 
   mesh_facets.initElementTypeMapArray(tangents,
 				     tangent_components,
 				     spatial_dimension - 1);
 
   Mesh::type_iterator it   = mesh_facets.firstType(spatial_dimension - 1);
   Mesh::type_iterator last = mesh_facets.lastType(spatial_dimension - 1);
 
   for (; it != last; ++it) {
     ElementType facet_type = *it;
 
     const Array<Real> & normals =
       getFEEngine("FacetsFEEngine").getNormalsOnQuadPoints(facet_type);
 
     UInt nb_quad = normals.getSize();
 
     Array<Real> & tang = tangents(facet_type);
     tang.resize(nb_quad);
 
     Real * normal_it = normals.storage();
     Real * tangent_it = tang.storage();
 
     /// compute first tangent
     for (UInt q = 0; q < nb_quad; ++q) {
 
       /// if normal is orthogonal to xy plane, arbitrarly define tangent
       if ( Math::are_float_equal(Math::norm2(normal_it), 0) )
 	tangent_it[0] = 1;
       else
 	Math::normal2(normal_it, tangent_it);
 
       normal_it += spatial_dimension;
       tangent_it += tangent_components;
     }
 
     /// compute second tangent (3D case)
     if (spatial_dimension == 3) {
       normal_it = normals.storage();
       tangent_it = tang.storage();
 
       for (UInt q = 0; q < nb_quad; ++q) {
 	Math::normal3(normal_it, tangent_it, tangent_it + spatial_dimension);
 	normal_it += spatial_dimension;
 	tangent_it += tangent_components;
       }
     }
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
-void SolidMechanicsModelCohesive::checkCohesiveStress() {
-  AKANTU_DEBUG_IN();
-
+void SolidMechanicsModelCohesive::interpolateStress() {
   for (UInt m = 0; m < materials.size(); ++m) {
     try {
       MaterialCohesive & mat __attribute__((unused)) =
 	dynamic_cast<MaterialCohesive &>(*materials[m]);
     } catch(std::bad_cast&) {
       /// interpolate stress on facet quadrature points positions
       materials[m]->interpolateStressOnFacets(facet_stress);
     }
   }
 
 #if defined(AKANTU_DEBUG_TOOLS)
   debug::element_manager.printData(debug::_dm_model_cohesive,
 				   "Interpolated stresses before",
 				   facet_stress);
 #endif
 
   synch_registry->synchronize(_gst_smmc_facets_stress);
 
 #if defined(AKANTU_DEBUG_TOOLS)
   debug::element_manager.printData(debug::_dm_model_cohesive,
 				   "Interpolated stresses",
 				   facet_stress);
 #endif
+}
+
+/* -------------------------------------------------------------------------- */
+void SolidMechanicsModelCohesive::checkCohesiveStress() {
+  AKANTU_DEBUG_IN();
+
+  interpolateStress();
 
   for (UInt m = 0; m < materials.size(); ++m) {
     try {
       MaterialCohesive & mat_cohesive = dynamic_cast<MaterialCohesive &>(*materials[m]);
       /// check which not ghost cohesive elements are to be created
       mat_cohesive.checkInsertion();
     } catch(std::bad_cast&) { }
   }
 
   /*  if(static and extrinsic) {
       check max mean stresses
       and change inserter.getInsertionFacets(type_facet);
       }
   */
 
   /// communicate data among processors
   synch_registry->synchronize(_gst_smmc_facets);
 
   /// insert cohesive elements
   inserter->insertElements();
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::onElementsAdded(const Array<Element> & element_list,
 						  const NewElementsEvent & event) {
   AKANTU_DEBUG_IN();
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   updateCohesiveSynchronizers();
 #endif
 
   SolidMechanicsModel::onElementsAdded(element_list, event);
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
   if (cohesive_distributed_synchronizer != NULL)
     cohesive_distributed_synchronizer->computeAllBufferSizes(*this);
 #endif
 
   /// update shape functions
   getFEEngine("CohesiveFEEngine").initShapeFunctions(_not_ghost);
   getFEEngine("CohesiveFEEngine").initShapeFunctions(_ghost);
 
   if (is_extrinsic) resizeFacetStress();
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::onNodesAdded(const Array<UInt> & doubled_nodes,
 					       __attribute__((unused)) const NewNodesEvent & event) {
   AKANTU_DEBUG_IN();
 
   UInt nb_new_nodes = doubled_nodes.getSize();
   Array<UInt> nodes_list(nb_new_nodes);
 
   for (UInt n = 0; n < nb_new_nodes; ++n)
     nodes_list(n) = doubled_nodes(n, 1);
 
   SolidMechanicsModel::onNodesAdded(nodes_list, event);
 
   for (UInt n = 0; n < nb_new_nodes; ++n) {
 
     UInt old_node = doubled_nodes(n, 0);
     UInt new_node = doubled_nodes(n, 1);
 
     for (UInt dim = 0; dim < spatial_dimension; ++dim) {
       (*displacement)(new_node, dim) = (*displacement)(old_node, dim);
       (*velocity)    (new_node, dim) = (*velocity)    (old_node, dim);
       (*acceleration)(new_node, dim) = (*acceleration)(old_node, dim);
       (*blocked_dofs)(new_node, dim) = (*blocked_dofs)(old_node, dim);
 
       if (current_position)
 	(*current_position)(new_node, dim) = (*current_position)(old_node, dim);
 
       if (increment_acceleration)
 	(*increment_acceleration)(new_node, dim)
 	  = (*increment_acceleration)(old_node, dim);
 
       if (increment)
 	(*increment)(new_node, dim) = (*increment)(old_node, dim);
 
       if (previous_displacement)
 	(*previous_displacement)(new_node, dim)
 	  = (*previous_displacement)(old_node, dim);
     }
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::onEndSolveStep(const AnalysisMethod & method) {
 
   AKANTU_DEBUG_IN();
 
   /******************************************************************************
     This is required because the Cauchy stress is the stress measure that is used
      to check the insertion of cohesive elements
   ******************************************************************************/
 
   std::vector<Material *>::iterator mat_it;
   for(mat_it = materials.begin(); mat_it != materials.end(); ++mat_it) {
     Material & mat = **mat_it;
     if(mat.isFiniteDeformation())
       mat.computeAllCauchyStresses(_not_ghost);
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::printself(std::ostream & stream, int indent) const {
   std::string space;
   for(Int i = 0; i < indent; i++, space += AKANTU_INDENT);
 
   stream << space << "SolidMechanicsModelCohesive [" << std::endl;
 
   SolidMechanicsModel::printself(stream, indent + 1);
 
   stream << space << "]" << std::endl;
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::resizeFacetStress() {
   AKANTU_DEBUG_IN();
 
   Mesh & mesh_facets = inserter->getMeshFacets();
 
   for (ghost_type_t::iterator gt = ghost_type_t::begin();
        gt != ghost_type_t::end();
        ++gt) {
     GhostType ghost_type = *gt;
 
     Mesh::type_iterator it  = mesh_facets.firstType(spatial_dimension - 1, ghost_type);
     Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, ghost_type);
     for(; it != end; ++it) {
       ElementType type = *it;
 
       UInt nb_facet = mesh_facets.getNbElement(type, ghost_type);
 
       UInt nb_quadrature_points =
 	getFEEngine("FacetsFEEngine").getNbQuadraturePoints(type, ghost_type);
 
       UInt new_size = nb_facet * nb_quadrature_points;
 
       facet_stress(type, ghost_type).resize(new_size);
     }
   }
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 void SolidMechanicsModelCohesive::addDumpGroupFieldToDumper(const std::string & dumper_name,
 							    const std::string & field_id,
 							    const std::string & group_name,
 							    const ElementKind & element_kind,
 							    bool padding_flag) {
   AKANTU_DEBUG_IN();
 
   ElementKind _element_kind = element_kind;
   if (dumper_name == "cohesive elements") {
     _element_kind = _ek_cohesive;
   }
   SolidMechanicsModel::addDumpGroupFieldToDumper(dumper_name, 
 						 field_id,
 						 group_name,
 						 _element_kind,
 						 padding_flag);
 
   AKANTU_DEBUG_OUT();
 }
 
 /* -------------------------------------------------------------------------- */
 
 void SolidMechanicsModelCohesive::onDump(){
   this->flattenAllRegisteredInternals(_ek_cohesive);
   SolidMechanicsModel::onDump();
 }
 
 /* -------------------------------------------------------------------------- */
 
 
 
 __END_AKANTU__
diff --git a/src/model/solid_mechanics/solid_mechanics_model_cohesive.hh b/src/model/solid_mechanics/solid_mechanics_model_cohesive.hh
index a1324d67b..e853fe01a 100644
--- a/src/model/solid_mechanics/solid_mechanics_model_cohesive.hh
+++ b/src/model/solid_mechanics/solid_mechanics_model_cohesive.hh
@@ -1,290 +1,293 @@
 /**
  * @file   solid_mechanics_model_cohesive.hh
  *
  * @author Marco Vocialta <marco.vocialta@epfl.ch>
  *
  * @date creation: Tue May 08 2012
  * @date last modification: Tue Sep 02 2014
  *
  * @brief  Solid mechanics model for cohesive elements
  *
  * @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_SOLID_MECHANICS_MODEL_COHESIVE_HH__
 #define __AKANTU_SOLID_MECHANICS_MODEL_COHESIVE_HH__
 
 #include "solid_mechanics_model.hh"
 #include "solid_mechanics_model_event_handler.hh"
 #include "cohesive_element_inserter.hh"
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
 #  include "facet_synchronizer.hh"
 #  include "facet_stress_synchronizer.hh"
 #endif
 /* -------------------------------------------------------------------------- */
 
 __BEGIN_AKANTU__
 
 /* -------------------------------------------------------------------------- */
 struct SolidMechanicsModelCohesiveOptions : public SolidMechanicsModelOptions {
   SolidMechanicsModelCohesiveOptions(AnalysisMethod analysis_method = _explicit_lumped_mass,
 				     bool extrinsic = false,
 				     bool no_init_materials = false) :
     SolidMechanicsModelOptions(analysis_method, no_init_materials),
     extrinsic(extrinsic) {}
   bool extrinsic;
 };
 
 extern const SolidMechanicsModelCohesiveOptions default_solid_mechanics_model_cohesive_options;
 
 /* -------------------------------------------------------------------------- */
 /* Solid Mechanics Model for Cohesive elements                                */
 /* -------------------------------------------------------------------------- */
 
 class SolidMechanicsModelCohesive : public SolidMechanicsModel,
                                     public SolidMechanicsModelEventHandler{
   /* ------------------------------------------------------------------------ */
   /* Constructors/Destructors                                                 */
   /* ------------------------------------------------------------------------ */
 public:
   class NewCohesiveNodesEvent : public NewNodesEvent {
   public:
     AKANTU_GET_MACRO_NOT_CONST(OldNodesList, old_nodes, Array<UInt> &);
     AKANTU_GET_MACRO(OldNodesList, old_nodes, const Array<UInt> &);
   protected:
     Array<UInt> old_nodes;
   };
 
   typedef FEEngineTemplate<IntegratorGauss, ShapeLagrange, _ek_cohesive> MyFEEngineCohesiveType;
 
   SolidMechanicsModelCohesive(Mesh & mesh,
 			      UInt spatial_dimension = _all_dimensions,
 			      const ID & id = "solid_mechanics_model_cohesive",
 			      const MemoryID & memory_id = 0);
 
   virtual ~SolidMechanicsModelCohesive();
 
   /* ------------------------------------------------------------------------ */
   /* Methods                                                                  */
   /* ------------------------------------------------------------------------ */
 public:
   /// set the value of the time step
   void setTimeStep(Real time_step);
 
   /// assemble the residual for the explicit scheme
   virtual void updateResidual(bool need_initialize = true);
 
   /// function to print the contain of the class
   virtual void printself(std::ostream & stream, int indent = 0) const;
 
   /// function to perform a stress check on each facet and insert
   /// cohesive elements if needed
   void checkCohesiveStress();
 
+  /// interpolate stress on facets
+  void interpolateStress();
+
   /// initialize the cohesive model
   void initFull(const ModelOptions & options = default_solid_mechanics_model_cohesive_options);
 
   /// initialize the model
   void initModel();
 
   /// initialize cohesive material
   void initMaterials();
 
   /// init facet filters for cohesive materials
   void initFacetFilter();
 
   /// limit the cohesive element insertion to a given area
   void limitInsertion(BC::Axis axis, Real first_limit, Real second_limit);
 
   /// update automatic insertion after a change in the element inserter
   void updateAutomaticInsertion();
 
   /// insert intrinsic cohesive elements
   void insertIntrinsicElements();
 
 
   //  template <SolveConvergenceMethod method, SolveConvergenceCriteria criteria>
   //  bool solveStepCohesive(Real tolerance, UInt max_iteration = 100);
 
   template<SolveConvergenceMethod cmethod, SolveConvergenceCriteria criteria>
   bool solveStepCohesive(Real tolerance,
                          Real & error,
                          UInt max_iteration = 100,
                          bool do_not_factorize = false);
 
 
 private:
 
   /// initialize completely the model for extrinsic elements
   void initAutomaticInsertion();
 
   /// initialize stress interpolation
   void initStressInterpolation();
 
   /// compute facets' normals
   void computeNormals();
 
   /// resize facet stress
   void resizeFacetStress();
 
   /// init facets_check array
   void initFacetsCheck();
 
   /* ------------------------------------------------------------------------ */
   /* Mesh Event Handler inherited members                                     */
   /* ------------------------------------------------------------------------ */
 
 protected:
 
   virtual void onNodesAdded  (const Array<UInt> & nodes_list,
 			      const NewNodesEvent & event);
   virtual void onElementsAdded  (const Array<Element> & nodes_list,
 				 const NewElementsEvent & event);
 
   /* ------------------------------------------------------------------------ */
   /* SolidMechanicsModelEventHandler inherited members                        */
   /* ------------------------------------------------------------------------ */
 public:
   virtual void onEndSolveStep(const AnalysisMethod & method);
 
   /* ------------------------------------------------------------------------ */
   /* Dumpable interface                                                       */
   /* ------------------------------------------------------------------------ */
 public:
 
   virtual void onDump();
 
   virtual void addDumpGroupFieldToDumper(const std::string & dumper_name,
 					 const std::string & field_id,
 					 const std::string & group_name,
 					 const ElementKind & element_kind,
 					 bool padding_flag);
 
   /* ------------------------------------------------------------------------ */
   /* Accessors                                                                */
   /* ------------------------------------------------------------------------ */
 public:
 
   /// get facet mesh
   AKANTU_GET_MACRO(MeshFacets, mesh.getMeshFacets(), const Mesh &);
 
   /// get stress on facets vector
   AKANTU_GET_MACRO_BY_ELEMENT_TYPE_CONST(StressOnFacets, facet_stress, Real);
 
   /// get facet material
   AKANTU_GET_MACRO_BY_ELEMENT_TYPE(FacetMaterial, facet_material, UInt);
 
   /// get facet material
   AKANTU_GET_MACRO_BY_ELEMENT_TYPE_CONST(FacetMaterial, facet_material, UInt);
 
   /// get facet material
   AKANTU_GET_MACRO(FacetMaterial, facet_material, const ElementTypeMapArray<UInt> &);
 
   /// @todo THIS HAS TO BE CHANGED
   AKANTU_GET_MACRO_BY_ELEMENT_TYPE_CONST(Tangents, tangents, Real);
 
   /// get element inserter
   AKANTU_GET_MACRO_NOT_CONST(ElementInserter, *inserter, CohesiveElementInserter &);
 
   /// get is_extrinsic boolean
   AKANTU_GET_MACRO(IsExtrinsic, is_extrinsic, bool);
 
   /* ------------------------------------------------------------------------ */
   /* Class Members                                                            */
   /* ------------------------------------------------------------------------ */
 private:
 
   /// @todo store tangents when normals are computed:
   ElementTypeMapArray<Real> tangents;
 
   /// stress on facets on the two sides by quadrature point
   ElementTypeMapArray<Real> facet_stress;
 
   /// material to use if a cohesive element is created on a facet
   ElementTypeMapArray<UInt> facet_material;
 
   bool is_extrinsic;
 
   /// cohesive element inserter
   CohesiveElementInserter * inserter;
 
 #if defined(AKANTU_PARALLEL_COHESIVE_ELEMENT)
 #include "solid_mechanics_model_cohesive_parallel.hh"
 #endif
 
 };
 
 
 /* -------------------------------------------------------------------------- */
 /* inline functions                                                           */
 /* -------------------------------------------------------------------------- */
 
 /* -------------------------------------------------------------------------- */
 class DefaultMaterialCohesiveSelector : public DefaultMaterialSelector {
 public:
   DefaultMaterialCohesiveSelector(const SolidMechanicsModelCohesive & model) :
     DefaultMaterialSelector(model.getMaterialByElement()),
     facet_material(model.getFacetMaterial()),
     mesh(model.getMesh()) { }
 
   inline virtual UInt operator()(const Element & element) {
     if(Mesh::getKind(element.type) == _ek_cohesive) {
       try {
 	const Array<Element> & cohesive_el_to_facet
 	  = mesh.getMeshFacets().getSubelementToElement(element.type, element.ghost_type);
 	bool third_dimension = (mesh.getSpatialDimension() == 3);
 	const Element & facet = cohesive_el_to_facet(element.element, third_dimension);
 	if(facet_material.exists(facet.type, facet.ghost_type)) {
 	  return facet_material(facet.type, facet.ghost_type)(facet.element);
 	} else {
 	  return MaterialSelector::operator()(element);
 	}
       } catch (...) {
 	return MaterialSelector::operator()(element);
       }
     } else if (Mesh::getSpatialDimension(element.type) == mesh.getSpatialDimension() - 1) {
       return facet_material(element.type, element.ghost_type)(element.element);
     } else {
       return DefaultMaterialSelector::operator()(element);
     }
   }
 
 private:
   const ElementTypeMapArray<UInt> & facet_material;
   const Mesh & mesh;
 };
 
 
 /// standard output stream operator
 inline std::ostream & operator <<(std::ostream & stream, const SolidMechanicsModelCohesive & _this)
 {
   _this.printself(stream);
   return stream;
 }
 
 
 __END_AKANTU__
 
 #if defined (AKANTU_INCLUDE_INLINE_IMPL)
 #  include "solid_mechanics_model_cohesive_inline_impl.cc"
 #endif
 
 #endif /* __AKANTU_SOLID_MECHANICS_MODEL_COHESIVE_HH__ */