diff --git a/include/hpp/manipulation/axial-handle.hh b/include/hpp/manipulation/axial-handle.hh
index 66c5ab1c62597db975eee4e9d0e6579d18363a24..5cd036895f03411c998e6f6dd7f5ef2928c8da47 100644
--- a/include/hpp/manipulation/axial-handle.hh
+++ b/include/hpp/manipulation/axial-handle.hh
@@ -51,7 +51,7 @@ namespace hpp {
       /// \return the constraint of relative transformation between the handle and
       ///         the gripper. The rotation around x is not constrained.
       virtual NumericalConstraintPtr_t createGrasp
-      (const GripperPtr_t& gripper) const;
+      (const GripperPtr_t& gripper, std::string name) const;
 
       /// Create constraint that acts on the non-constrained axis of the
       /// constraint generated by Handle::createGrasp.
@@ -59,7 +59,7 @@ namespace hpp {
       /// \return a relative orientation constraint between the handle and
       ///         the gripper. Only the rotation around the x-axis is constrained.
       virtual NumericalConstraintPtr_t createGraspComplement
-      (const GripperPtr_t& gripper) const;
+      (const GripperPtr_t& gripper, std::string name) const;
 
       /// Create constraint corresponding to a pregrasping task.
       /// \param gripper object containing the gripper information
@@ -69,7 +69,7 @@ namespace hpp {
       /// \todo this function is never called. It should follow changes of
       ///       Handle::createPreGrasp prototype.
       virtual NumericalConstraintPtr_t createPreGrasp
-      (const GripperPtr_t& gripper, const value_type& shift) const;
+      (const GripperPtr_t& gripper, const value_type& shift, std::string name) const;
 
       /// Create constraint that acts on the non-constrained axis of the
       /// constraint generated by Handle::createPreGrasp.
@@ -81,7 +81,7 @@ namespace hpp {
       /// \note The translation along x-axis and the rotation around z-axis are constrained.
       virtual NumericalConstraintPtr_t createPreGraspComplement
       (const GripperPtr_t& gripper, const value_type& shift,
-       const value_type& width) const;
+       const value_type& width, std::string name) const;
 
       virtual std::ostream& print (std::ostream& os) const;
     protected:
diff --git a/include/hpp/manipulation/handle.hh b/include/hpp/manipulation/handle.hh
index 7575518c7f6b5cd0fb0a749db86f442c506b27f7..fdf75c6db5bc063864864160fa0b1817101f31ac 100644
--- a/include/hpp/manipulation/handle.hh
+++ b/include/hpp/manipulation/handle.hh
@@ -98,14 +98,14 @@ namespace hpp {
       ///         the gripper.
       /// \note The 6 DOFs of the relative transformation are constrained.
       virtual NumericalConstraintPtr_t createGrasp
-      (const GripperPtr_t& gripper) const;
+      (const GripperPtr_t& gripper, std::string name) const;
 
       /// Create constraint that acts on the non-constrained axis of the
       /// constraint generated by Handle::createGrasp.
       /// \param gripper object containing the gripper information
       /// \return a constraints that is not doing anything.
       virtual NumericalConstraintPtr_t createGraspComplement
-      (const GripperPtr_t& gripper) const;
+      (const GripperPtr_t& gripper, std::string name) const;
 
       /// Create constraint corresponding to a pregrasping task.
       /// \param gripper object containing the gripper information
@@ -115,12 +115,12 @@ namespace hpp {
       ///       are constrained. The transformation is shifted along x-axis of
       ///       value shift.
       virtual NumericalConstraintPtr_t createPreGrasp
-      (const GripperPtr_t& gripper, const value_type& shift) const;
+      (const GripperPtr_t& gripper, const value_type& shift, std::string name) const;
 
       static NumericalConstraintPtr_t createGrasp
-      (const GripperPtr_t& gripper,const HandlePtr_t& handle)
+      (const GripperPtr_t& gripper,const HandlePtr_t& handle, std::string name)
       {
-        return handle->createGrasp(gripper);
+        return handle->createGrasp(gripper, name);
       }
 
       /// Get the clearance
diff --git a/src/axial-handle.cc b/src/axial-handle.cc
index 7a263cb2da49c87e0d903ff57ceaa572fbecce8a..0cf828f3a8bbe33395b2e1ce5decce33bf46c3d0 100644
--- a/src/axial-handle.cc
+++ b/src/axial-handle.cc
@@ -33,14 +33,15 @@ namespace hpp {
     static const matrix3_t I3 = matrix3_t::Identity();
 
     NumericalConstraintPtr_t AxialHandle::createGrasp
-    (const GripperPtr_t& gripper) const
+    (const GripperPtr_t& gripper, std::string n) const
     {
       using boost::assign::list_of;
       std::vector <bool> mask = list_of (true)(true)(true)(true)(true)(false);
+      if (n.empty())
+        n = "Transformation_(1,1,1,1,1,0)_" + name() + "_" + gripper->name();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Transformation_(1,1,1,1,1,0)_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
 				       gripper->objectPositionInJoint (),
@@ -48,15 +49,16 @@ namespace hpp {
     }
 
     NumericalConstraintPtr_t AxialHandle::createGraspComplement
-    (const GripperPtr_t& gripper) const
+    (const GripperPtr_t& gripper, std::string n) const
     {
       using boost::assign::list_of;
       std::vector <bool> mask = list_of (false)(false)(false)(false)(false)
         (true);
+      if (n.empty())
+        n = "Transformation_(0,0,0,0,0,1)_" + name() + "_" + gripper->name();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Transformation_(0,0,0,0,0,1)_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
 				       gripper->objectPositionInJoint (),
@@ -65,16 +67,17 @@ namespace hpp {
     }
 
     NumericalConstraintPtr_t AxialHandle::createPreGrasp
-    (const GripperPtr_t& gripper, const value_type& shift) const
+    (const GripperPtr_t& gripper, const value_type& shift, std::string n) const
     {
       using boost::assign::list_of;
       std::vector <bool> mask = list_of (true)(true)(true)(true)(true)(false);
       Transform3f transform = gripper->objectPositionInJoint ()
         * Transform3f (I3, vector3_t (shift,0,0));
+      if (n.empty())
+        n = "Transformation_(1,1,1,1,1,0)_" + name () + "_" + gripper->name ();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Transformation_(1,1,1,1,1,0)_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
 				       transform,
@@ -83,7 +86,7 @@ namespace hpp {
 
     NumericalConstraintPtr_t AxialHandle::createPreGraspComplement
     (const GripperPtr_t& gripper, const value_type& shift,
-     const value_type& width) const
+     const value_type& width, std::string n) const
     {
       using boost::assign::list_of;
       using core::DoubleInequality;
@@ -91,10 +94,11 @@ namespace hpp {
         (false);
       Transform3f transform = gripper->objectPositionInJoint ()
         * Transform3f (I3, vector3_t (shift,0,0));
+      if (n.empty())
+        n = "Transformation_(1,0,0,0,0,0)_" + name() + "_" + gripper->name();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Transformation_(1,0,0,0,0,0)_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
 				       transform, localPosition(), mask),
diff --git a/src/graph/helper.cc b/src/graph/helper.cc
index 93e546d52c807321d3167edb01d3ea7ab78e3afc..62c52a72026630d08d6704e00cffa250d5dbba49 100644
--- a/src/graph/helper.cc
+++ b/src/graph/helper.cc
@@ -444,20 +444,20 @@ namespace hpp {
             const GripperPtr_t& gripper, const HandlePtr_t& handle,
             FoliatedManifold& grasp, FoliatedManifold& pregrasp)
         {
-          NumericalConstraintPtr_t gc  = handle->createGrasp (gripper);
+          NumericalConstraintPtr_t gc  = handle->createGrasp (gripper, "");
           grasp.nc.nc.push_back (gc);
           grasp.nc.pdof.push_back (SizeIntervals_t ());
           grasp.nc_path.nc.push_back (gc);
           // TODO: see function declaration
           grasp.nc_path.pdof.push_back (SizeIntervals_t ());
-          NumericalConstraintPtr_t gcc = handle->createGraspComplement (gripper);
+          NumericalConstraintPtr_t gcc = handle->createGraspComplement (gripper, "");
           if (gcc->function ().outputSize () > 0) {
             grasp.nc_fol.nc.push_back (gcc);
             grasp.nc_fol.pdof.push_back (SizeIntervals_t());
           }
 
           const value_type c = handle->clearance () + gripper->clearance ();
-          NumericalConstraintPtr_t pgc = handle->createPreGrasp (gripper, c);
+          NumericalConstraintPtr_t pgc = handle->createPreGrasp (gripper, c, "");
           pregrasp.nc.nc.push_back (pgc);
           pregrasp.nc.pdof.push_back (SizeIntervals_t());
           pregrasp.nc_path.nc.push_back (pgc);
diff --git a/src/handle.cc b/src/handle.cc
index 1ef224ab3d5db2271f0fe64be724800330bb3863..2df138874f0d2f5ededbfcd118016d109c5e64f7 100644
--- a/src/handle.cc
+++ b/src/handle.cc
@@ -106,20 +106,22 @@ namespace hpp {
     }
 
     NumericalConstraintPtr_t Handle::createGrasp
-    (const GripperPtr_t& gripper) const
+    (const GripperPtr_t& gripper, std::string n) const
     {
       using core::ExplicitRelativeTransformation;
       // If handle is on a freeflying object, create an explicit constraint
       if (is6Dmask(mask_) && isHandleOnR3SO3 (*this)) {
+        if (n.empty())
+          n = "Explicit_relative_transform_" + name() + "_" + gripper->name();
 	return ExplicitRelativeTransformation::create
-	  ("Explicit_relative_transform_" + name () + "_" + gripper->name (),
-	   gripper->joint ()->robot (), gripper->joint (), joint (),
+	  (n, gripper->joint ()->robot (), gripper->joint (), joint (),
 	   gripper->objectPositionInJoint (), localPosition())->createNumericalConstraint();
       }
+      if (n.empty())
+        n = "Grasp_" + maskToStr(mask_) + "_" + name() + "_" + gripper->name();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Grasp_" + maskToStr(mask_) + "_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
 				       gripper->objectPositionInJoint (),
@@ -127,22 +129,24 @@ namespace hpp {
     }
 
     NumericalConstraintPtr_t Handle::createGraspComplement
-    (const GripperPtr_t& gripper) const
+    (const GripperPtr_t& gripper, std::string n) const
     {
       core::DevicePtr_t robot = gripper->joint()->robot();
       if (is6Dmask(mask_)) {
+        if (n.empty())
+          n = "GraspComp_(0,0,0,0,0,0)_" + name () + "_" + gripper->name ();
         return NumericalConstraint::create (
             boost::shared_ptr <ZeroDiffFunc> (new ZeroDiffFunc (
-                robot->configSize(), robot->numberDof (),
-                "GraspComp_(0,0,0,0,0,0)_" + name () + "_" + gripper->name ()
-                ))
+                robot->configSize(), robot->numberDof (), n))
             );
       } else {
         // TODO handle cases where rotations or translation are allowed.
         std::vector<bool> Cmask = complementMask(mask_);
+        if (n.empty())
+          n = "Transformation_" + maskToStr(Cmask) + "_" + name ()
+            + "_" + gripper->name ();
         RelativeTransformationPtr_t function = RelativeTransformation::create
-          ("Transformation_" + maskToStr(Cmask) + "_" + name ()
-           + "_" + gripper->name (),
+          (n,
            gripper->joint()->robot(),
            gripper->joint (), joint (),
            gripper->objectPositionInJoint (),
@@ -156,15 +160,17 @@ namespace hpp {
     }
 
     NumericalConstraintPtr_t Handle::createPreGrasp
-    (const GripperPtr_t& gripper, const value_type& shift) const
+    (const GripperPtr_t& gripper, const value_type& shift, std::string n) const
     {
       using boost::assign::list_of;
       Transform3f transform = gripper->objectPositionInJoint ()
         * Transform3f (I3, vector3_t (shift,0,0));
+      if (n.empty())
+        n = "Pregrasp_ " + maskToStr(mask_) + "_" + name ()
+          + "_" + gripper->name ();
       return NumericalConstraintPtr_t
 	(NumericalConstraint::create (RelativeTransformation::create
-				      ("Pregrasp_ " + maskToStr(mask_) + "_" + name ()
-				       + "_" + gripper->name (),
+				      (n,
 				       gripper->joint()->robot(),
 				       gripper->joint (), joint (),
                                        transform, localPosition(), mask_)));
diff --git a/src/problem-solver.cc b/src/problem-solver.cc
index d61ee2043219c2d7468c81e8bd002ceedbacb2d5..b93edd8536da71516b7b7f182d541118f3f8c174 100644
--- a/src/problem-solver.cc
+++ b/src/problem-solver.cc
@@ -296,10 +296,11 @@ namespace hpp {
       if (!g) throw std::runtime_error ("No gripper with name " + gripper + ".");
       HandlePtr_t h = robot_->get <HandlePtr_t> (handle);
       if (!h) throw std::runtime_error ("No handle with name " + handle + ".");
-      NumericalConstraintPtr_t constraint (h->createGrasp (g));
-      NumericalConstraintPtr_t complement (h->createGraspComplement (g));
-      addNumericalConstraint (name, constraint);
-      addNumericalConstraint (name + "/complement", complement);
+      const std::string cname = name + "/complement";
+      NumericalConstraintPtr_t constraint (h->createGrasp (g, name));
+      NumericalConstraintPtr_t complement (h->createGraspComplement (g, cname));
+      addNumericalConstraint ( name, constraint);
+      addNumericalConstraint (cname, complement);
     }
 
     void ProblemSolver::createPreGraspConstraint
@@ -312,7 +313,7 @@ namespace hpp {
       if (!h) throw std::runtime_error ("No handle with name " + handle + ".");
 
       value_type c = h->clearance () + g->clearance ();
-      NumericalConstraintPtr_t constraint = h->createPreGrasp (g, c);
+      NumericalConstraintPtr_t constraint = h->createPreGrasp (g, c, name);
       addNumericalConstraint (name, constraint);
     }