diff --git a/src/darwin_arm_kinematics.cpp b/src/darwin_arm_kinematics.cpp
index b298dc97579cdff3497fe2183fb562651b1fbdd8..2c21495e7111fda0df9ea6456bf1a657e73bd478 100644
--- a/src/darwin_arm_kinematics.cpp
+++ b/src/darwin_arm_kinematics.cpp
@@ -17,6 +17,11 @@ CDarwinArmKinematics::CDarwinArmKinematics()
   this->iksolver_pos=NULL;
   this->chain=NULL;
   this->num_dof=0;
+  this->max_attempts=DEFAULT_MAX_IK_ATTEMPTS;
+  this->max_ik_tolerance=DEFAULT_MAX_IK_TOLERANCE;
+  this->max_iter=DEFAULT_MAX_FK_ITERATIONS;
+  this->max_fk_tolerance=DEFAULT_MAX_FK_TOLERANCE;
+  this->joint_names.clear();
 }
 
 double CDarwinArmKinematics::angle_norm(double angle)
@@ -44,6 +49,7 @@ void CDarwinArmKinematics::load_chain(std::string &filename)
       if(extra<0) extra=0;
       this->q_max.resize(6);
       this->q_min.resize(6);
+      this->joint_names.clear();
       if(this->chain!=NULL)
       {
         delete this->chain;
@@ -57,6 +63,7 @@ void CDarwinArmKinematics::load_chain(std::string &filename)
         this->chain->addSegment(KDL::Segment(KDL::Joint(KDL::Joint::RotZ),KDL::Frame::DH(iterator->params().a(),
                                 iterator->params().alpha(),iterator->params().d(),iterator->params().theta())));
         this->num_dof++;
+        this->joint_names.push_back(iterator->name());
       }
       /* add extra joints to get to 6 dof */
       for(;i<6;i++)
@@ -75,7 +82,7 @@ void CDarwinArmKinematics::load_chain(std::string &filename)
       this->iksolver_vel=new KDL::ChainIkSolverVel_pinv(*this->chain);
       if(this->iksolver_pos!=NULL)
         delete this->iksolver_pos;
-      this->iksolver_pos=new KDL::ChainIkSolverPos_NR_JL(*this->chain,this->q_min,this->q_max,*this->fksolver,*this->iksolver_vel,100,1e-3);
+      this->iksolver_pos=new KDL::ChainIkSolverPos_NR_JL(*this->chain,this->q_min,this->q_max,*this->fksolver,*this->iksolver_vel,this->max_iter,this->max_fk_tolerance);
     }catch(const xml_schema::exception& e){
       std::ostringstream os;
       os << e;
@@ -86,6 +93,56 @@ void CDarwinArmKinematics::load_chain(std::string &filename)
     throw CDarwinRobotException(_HERE_,"Arm chain definition file does not exist");
 }
 
+unsigned int CDarwinArmKinematics::get_num_dof(void)
+{
+  return this->num_dof;
+}
+
+std::vector<std::string> CDarwinArmKinematics::get_joint_names(void)
+{
+  return this->joint_names;
+}
+
+void CDarwinArmKinematics::set_ik_max_attempts(unsigned int attempts)
+{
+  this->max_attempts=attempts;
+}
+
+unsigned int CDarwinArmKinematics::get_ik_max_attempts(void)
+{
+  return this->max_attempts;
+}
+
+void CDarwinArmKinematics::set_ik_max_tolerance(double tolerance)
+{
+  this->max_ik_tolerance=tolerance;
+}
+
+double CDarwinArmKinematics::get_ik_max_tolerance(void)
+{
+  return this->max_ik_tolerance;
+}
+
+void CDarwinArmKinematics::set_fk_max_iterations(unsigned int iter)
+{
+  this->max_iter=iter;
+}
+
+unsigned int CDarwinArmKinematics::get_fk_max_iterations(void)
+{
+  return this->max_iter;
+}
+
+void CDarwinArmKinematics::set_fk_max_tolerance(double tolerance)
+{  
+  this->max_fk_tolerance=tolerance;
+}
+
+double CDarwinArmKinematics::get_fk_max_tolerance(void)
+{
+  return this->max_fk_tolerance;
+}
+
 void CDarwinArmKinematics::get_forward_kinematics(std::vector<double> &angles,std::vector<double> &pos,std::vector<double> &rot)
 {
   double yaw=0.0,pitch=0.0,roll=0.0;
@@ -123,11 +180,12 @@ void CDarwinArmKinematics::get_forward_kinematics(std::vector<double> &angles,st
 
 void CDarwinArmKinematics::get_inverse_kinematics(std::vector<double> &pos,std::vector<double> &rot,std::vector<double> &angles)
 {
-  int count=0,kinematics_status;
+  int kinematics_status;
   KDL::JntArray q_init,joints;
   KDL::Frame cartpos_sol;
   KDL::Vector error;
-  unsigned int i=0;
+  double max_error=0.0;
+  unsigned int i=0,count=0;
 
   if(pos.size()!=3 || rot.size()!=3)
     throw CDarwinRobotException(_HERE_,"Invalid position and/or rotation vector sizes");
@@ -147,9 +205,14 @@ void CDarwinArmKinematics::get_inverse_kinematics(std::vector<double> &pos,std::
     if(kinematics_status<0)
       throw CDarwinRobotException(_HERE_,"Impossible to find solution");
     else
+    {
       error=desired_frame.p-cartpos_sol.p;
-  }while((fabs(error(0))>0.001 || fabs(error(1))>0.001 || fabs(error(2))>0.001) && count<50);
-  if(count<50)
+      for(i=0;i<this->num_dof;i++)
+        if(fabs(error(i))>max_error)
+          max_error=fabs(error(i));
+    }
+  }while(max_error>this->max_ik_tolerance && count<this->max_attempts);
+  if(count<this->max_attempts)
   {
     angles.resize(this->num_dof);
     for(i=0;i<this->num_dof;i++)
diff --git a/src/darwin_arm_kinematics.h b/src/darwin_arm_kinematics.h
index 6737deef9550e07890fb00ef23a6d682a8583140..66d8a68a055f4348b577fa29b0e092a5a56cd50c 100644
--- a/src/darwin_arm_kinematics.h
+++ b/src/darwin_arm_kinematics.h
@@ -8,6 +8,11 @@
 #include <kdl/chainiksolvervel_pinv.hpp>
 #include <kdl/frames_io.hpp>
 
+#define DEFAULT_MAX_IK_ATTEMPTS    50
+#define DEFAULT_MAX_IK_TOLERANCE   0.001
+#define DEFAULT_MAX_FK_ITERATIONS  100
+#define DEFAULT_MAX_FK_TOLERANCE   0.001
+
 class CDarwinArmKinematics
 { 
   private:
@@ -17,12 +22,30 @@ class CDarwinArmKinematics
     KDL::ChainFkSolverPos_recursive *fksolver;
     KDL::ChainIkSolverVel_pinv *iksolver_vel;
     KDL::ChainIkSolverPos_NR_JL *iksolver_pos;
+    /* ik parameters */
+    unsigned int max_attempts;
+    double max_ik_tolerance;
+    /* fk parameters */
+    unsigned int max_iter;
+    double max_fk_tolerance;
+    /* general parameters */
     unsigned int num_dof;
+    std::vector<std::string> joint_names;
   protected:
     double angle_norm(double angle);
   public:
     CDarwinArmKinematics();
     void load_chain(std::string &filename);
+    unsigned int get_num_dof(void);
+    std::vector<std::string> get_joint_names(void);
+    void set_ik_max_attempts(unsigned int attempts);
+    unsigned int get_ik_max_attempts(void);
+    void set_ik_max_tolerance(double tolerance);
+    double get_ik_max_tolerance(void);
+    void set_fk_max_iterations(unsigned int iter);
+    unsigned int get_fk_max_iterations(void);
+    void set_fk_max_tolerance(double tolerance);
+    double get_fk_max_tolerance(void);
     void get_forward_kinematics(std::vector<double> &angles,std::vector<double> &pos,std::vector<double> &rot);
     void get_inverse_kinematics(std::vector<double> &pos,std::vector<double> &rot,std::vector<double> &angles);
     ~CDarwinArmKinematics();
diff --git a/src/darwin_leg_kinematics.cpp b/src/darwin_leg_kinematics.cpp
index 7cc2220bdf73b7353df7e053ed8875d632443fcf..8d0213506dca12da0e5fd41229ca30e7bdfc639c 100644
--- a/src/darwin_leg_kinematics.cpp
+++ b/src/darwin_leg_kinematics.cpp
@@ -17,6 +17,7 @@ CDarwinLegKinematics::CDarwinLegKinematics()
   this->num_dof=0;
   this->fwd_kin_transforms.clear();
   this->fwd_kin_params.clear();
+  this->joint_names.clear();
 }
 
 double CDarwinLegKinematics::angle_norm(double angle)
@@ -100,6 +101,7 @@ void CDarwinLegKinematics::load_chain(std::string &filename)
       this->fwd_kin_params.clear();
       this->fwd_kin_transforms.clear();
       this->num_dof=0;
+      this->joint_names.clear();
       for(iterator=chain->joint().begin(),i=0;iterator!=chain->joint().end();iterator++,i++)
       {
         params.alpha=iterator->params().alpha();
@@ -118,6 +120,7 @@ void CDarwinLegKinematics::load_chain(std::string &filename)
         transform(3,3)=1.0;
         this->fwd_kin_transforms.push_back(transform);
         this->num_dof++;
+        this->joint_names.push_back(iterator->name());
       }
     }catch(const xml_schema::exception& e){
       std::ostringstream os;
@@ -129,6 +132,16 @@ void CDarwinLegKinematics::load_chain(std::string &filename)
     throw CDarwinRobotException(_HERE_,"Leg chain definition file does not exist");
 }
 
+unsigned int CDarwinLegKinematics::get_num_dof(void)
+{
+  return this->num_dof;
+}
+
+std::vector<std::string> CDarwinLegKinematics::get_joint_names(void)
+{
+  return this->joint_names;
+}
+
 void CDarwinLegKinematics::get_forward_kinematics(std::vector<double> &angles,std::vector<double> &pos,std::vector<double> &rot)
 {
   unsigned int i=0;
diff --git a/src/darwin_leg_kinematics.h b/src/darwin_leg_kinematics.h
index 29b82c6f39b97aa5940396812fbda318bc3c4dc5..c1d3587b1313ca950bbe04be37a36cfd9c0e232f 100644
--- a/src/darwin_leg_kinematics.h
+++ b/src/darwin_leg_kinematics.h
@@ -24,6 +24,7 @@ class CDarwinLegKinematics
 { 
   private:
     unsigned int num_dof;
+    std::vector<std::string> joint_names;
     std::vector<Eigen::Matrix4d> fwd_kin_transforms;
     std::vector<TDHParams> fwd_kin_params;
   protected:
@@ -32,6 +33,8 @@ class CDarwinLegKinematics
   public:
     CDarwinLegKinematics();
     void load_chain(std::string &filename);
+    unsigned int get_num_dof(void);
+    std::vector<std::string> get_joint_names(void);
     static Eigen::Matrix4d generate_transform(Eigen::Vector3d &pos,Eigen::Vector3d &rot);
     static void get_transform_info(Eigen::Matrix4d &transform,Eigen::Vector3d &pos,Eigen::Vector3d &rot);
     void get_forward_kinematics(std::vector<double> &angles,std::vector<double> &pos,std::vector<double> &rot);
diff --git a/src/examples/darwin_arm_kin.cpp b/src/examples/darwin_arm_kin.cpp
index 8563c63c2910640bfc5c24c784bb1d4b7f8b6651..1b6567540949f0f3ce092ece7ebc0d005ab894f3 100644
--- a/src/examples/darwin_arm_kin.cpp
+++ b/src/examples/darwin_arm_kin.cpp
@@ -15,13 +15,22 @@ int main(int argc, char *argv[])
     CDarwinArmKinematics kin;
     kin.load_chain(kin_file);
 
-    joints_in[0]=atof(argv[1]);
-    joints_in[1]=atof(argv[2]);
-    joints_in[2]=atof(argv[3]);
-    joints_in[3]=atof(argv[4]);
-    kin.get_forward_kinematics(joints_in,pos,rot_out);
-    std::cout << pos[0] << "," << pos[1] << "," << pos[2] << std::endl;
+    if(argc!=5)
+    {
+      std::cout << "Invalid number of parameters: darwin_arm_kin <joint0 angle> <joint1 angle> <joint2 angle> <joint3 angle>" << std::endl;
+      exit(-1);
+    }
+    else
+    {
+      joints_in[0]=atof(argv[1]);
+      joints_in[1]=atof(argv[2]);
+      joints_in[2]=atof(argv[3]);
+      joints_in[3]=atof(argv[4]);
+      kin.get_forward_kinematics(joints_in,pos,rot_out);
+      std::cout << pos[0] << "," << pos[1] << "," << pos[2] << std::endl;
+    }
     return 0;
+
     pos.push_back(0.0743671);
     pos.push_back(0.0502218);
     pos.push_back(0.0791303);
@@ -31,6 +40,7 @@ int main(int argc, char *argv[])
     kin.get_inverse_kinematics(pos,rot_in,joints_out);
     std::cout << joints_out[0] << "," << joints_out[1] << "," << joints_out[2] << "," << joints_out[3] << std::endl;
     return 0;
+
     for(i=-1.5707;i<1.5707;i+=0.2)
     {
       for(j=-1.5707;j<1.5707;j+=0.2)
diff --git a/src/xml/darwin_kin_chain.xsd b/src/xml/darwin_kin_chain.xsd
index 1cb71d91c167b37efee67065344867611f7e33e9..191f127e27ac1097d41634ae94dedbb572adcb36 100644
--- a/src/xml/darwin_kin_chain.xsd
+++ b/src/xml/darwin_kin_chain.xsd
@@ -24,6 +24,8 @@ copyright : not copyrighted - public domain
 
   <xsd:complexType name="joint_t">
     <xsd:sequence>
+      <xsd:element name="name" type="xsd:string">
+      </xsd:element>
       <xsd:element name="params" type="dh_t">
       </xsd:element>
       <xsd:element name="max_angle" type="xsd:float">
diff --git a/src/xml/left_arm.xml b/src/xml/left_arm.xml
index f4e2cd1d671bf29f4a5464636acce0c28296e182..f592fb9546ec6a4a0f087ffa3b07efef1335d7c3 100644
--- a/src/xml/left_arm.xml
+++ b/src/xml/left_arm.xml
@@ -3,6 +3,7 @@
 <darwin_kin_chain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="darwin_kin_chain.xsd">
   <joint>
+    <name>j_shoulder_pitch_l</name>
     <params>
       <a>-0.016</a>
       <alpha>1.5707</alpha>
@@ -13,6 +14,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_shoulder_roll_l</name>
     <params>
       <a>-0.06</a>
       <alpha>1.5707</alpha>
@@ -23,6 +25,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_elbow_l</name>
     <params>
       <a>-0.02165</a>
       <alpha>1.5707</alpha>
@@ -33,6 +36,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_wrist_l</name>
     <params>
       <a>0</a>
       <alpha>0</alpha>
diff --git a/src/xml/left_leg.xml b/src/xml/left_leg.xml
index 70113b2064fc050ec29db7b05ed33818b8ab4163..32522de8dbf1f8bc1251c00dc9b73d9379bee856 100644
--- a/src/xml/left_leg.xml
+++ b/src/xml/left_leg.xml
@@ -3,6 +3,7 @@
 <darwin_kin_chain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="darwin_kin_chain.xsd">
   <joint>
+    <name>j_hip_yaw_l</name>
     <params>
       <a>0.0</a>
       <alpha>-1.5707</alpha>
@@ -13,6 +14,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_hip_roll_l</name>
     <params>
       <a>0.0</a>
       <alpha>-1.5707</alpha>
@@ -23,6 +25,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_hip_pitch_l</name>
     <params>
       <a>0.093</a>
       <alpha>0.0</alpha>
@@ -33,6 +36,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_knee_l</name>
     <params>
       <a>0.093</a>
       <alpha>3.14159</alpha>
@@ -43,6 +47,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_ankle_pitch_l</name>
     <params>
       <a>0.0</a>
       <alpha>1.5707</alpha>
@@ -53,6 +58,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_ankle_roll_l</name>
     <params>
       <a>0.0335</a>
       <alpha>0.0</alpha>
diff --git a/src/xml/right_arm.xml b/src/xml/right_arm.xml
index 1b4e6a1411d42668d7a858f1b9670853fb92bc4e..e61d8e2f081ef4a4d18ad9c8cf40dd7028080430 100644
--- a/src/xml/right_arm.xml
+++ b/src/xml/right_arm.xml
@@ -3,6 +3,7 @@
 <darwin_kin_chain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="darwin_kin_chain.xsd">
   <joint>
+    <name>j_shoulder_pitch_r</name>
     <params>
       <a>-0.016</a>
       <alpha>-1.5707</alpha>
@@ -13,6 +14,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_shoulder_roll_r</name>
     <params>
       <a>-0.06</a>
       <alpha>1.5707</alpha>
@@ -23,6 +25,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_elbow_r</name>
     <params>
       <a>-0.02165</a>
       <alpha>1.5707</alpha>
@@ -33,6 +36,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_wrist_r</name>
     <params>
       <a>0</a>
       <alpha>0</alpha>
diff --git a/src/xml/right_leg.xml b/src/xml/right_leg.xml
index 8a2152512acd2b6e011800ace438afbad1055a1e..6d3acc97c18d8d6242f31a6edffa56ab67bfcdf1 100644
--- a/src/xml/right_leg.xml
+++ b/src/xml/right_leg.xml
@@ -3,6 +3,7 @@
 <darwin_kin_chain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="darwin_kin_chain.xsd">
   <joint>
+    <name>j_hip_yaw_r</name>
     <params>
       <a>0.0</a>
       <alpha>-1.5707</alpha>
@@ -13,6 +14,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_hip_roll_r</name>
     <params>
       <a>0.0</a>
       <alpha>1.5707</alpha>
@@ -23,6 +25,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_hip_pitch_r</name>
     <params>
       <a>0.093</a>
       <alpha>0.0</alpha>
@@ -33,6 +36,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_knee_r</name>
     <params>
       <a>0.093</a>
       <alpha>3.14159</alpha>
@@ -43,6 +47,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_ankle_pitch_r</name>
     <params>
       <a>0.0</a>
       <alpha>-1.5707</alpha>
@@ -53,6 +58,7 @@
     <min_angle>-1.5707</min_angle>
   </joint>
   <joint>
+    <name>j_ankle_roll_r</name>
     <params>
       <a>0.0335</a>
       <alpha>0.0</alpha>