diff --git a/VirtualRobot/Manipulability/AbstractManipulability.cpp b/VirtualRobot/Manipulability/AbstractManipulability.cpp
index 80773025b6d029e3523f8ffa5e965ac190beec7b..fd130f3de6370a24db6f760a6bb405e571e60449 100644
--- a/VirtualRobot/Manipulability/AbstractManipulability.cpp
+++ b/VirtualRobot/Manipulability/AbstractManipulability.cpp
@@ -32,10 +32,11 @@
 namespace VirtualRobot
 {
 
-AbstractManipulability::AbstractManipulability(AbstractManipulability::Mode mode, AbstractManipulability::Type type) :
+AbstractManipulability::AbstractManipulability(AbstractManipulability::Mode mode, AbstractManipulability::Type type,  Eigen::MatrixXd weightMatrixInit) :
     mode(mode),
     type(type)
 {
+    weightMatrix = weightMatrixInit;
 }
 
 Eigen::MatrixXd AbstractManipulability::computeJacobian() {
diff --git a/VirtualRobot/Manipulability/AbstractManipulability.h b/VirtualRobot/Manipulability/AbstractManipulability.h
index 5603f989688759b5dac176fc4049701b66374521..27e336aa91a402df6ab3728d5e74f75c45a06d91 100644
--- a/VirtualRobot/Manipulability/AbstractManipulability.h
+++ b/VirtualRobot/Manipulability/AbstractManipulability.h
@@ -42,7 +42,7 @@ public:
         Whole = 1, Position = 2, Orientation = 3
     };
 
-    AbstractManipulability(Mode mode, Type type);
+    AbstractManipulability(Mode mode, Type type, Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd());
 
     Eigen::MatrixXd computeJacobian();
 
@@ -96,6 +96,8 @@ public:
 
     static IKSolver::CartesianSelection GetCartesianSelection(Mode mode);
 
+    Eigen::MatrixXd weightMatrix; 
+
 protected:
     virtual Eigen::MatrixXd computeJacobian(IKSolver::CartesianSelection mode) = 0;
 
diff --git a/VirtualRobot/Manipulability/SingleChainManipulability.cpp b/VirtualRobot/Manipulability/SingleChainManipulability.cpp
index adefea6d02d186a36d5fc6da40f958968c65a378..56e34e5b69201d3634b2ce8a8040a8c2a51b7a5d 100644
--- a/VirtualRobot/Manipulability/SingleChainManipulability.cpp
+++ b/VirtualRobot/Manipulability/SingleChainManipulability.cpp
@@ -37,7 +37,12 @@ namespace VirtualRobot
 {
 
 Eigen::MatrixXd AbstractSingleChainManipulability::computeManipulability(const Eigen::MatrixXd &jacobian, AbstractManipulability::Type type) {
-    Eigen::MatrixXd velocityManipulability = jacobian * jacobian.transpose();
+    if (weightMatrix.rows() == 0){
+        int nbJoints = jacobian.cols();
+        weightMatrix.setIdentity(nbJoints, nbJoints); 
+    }
+    std::cout << weightMatrix << std::endl;
+    Eigen::MatrixXd velocityManipulability = jacobian * weightMatrix * weightMatrix.transpose() * jacobian.transpose();
 
     switch (type) {
     case Velocity:
@@ -52,13 +57,14 @@ Eigen::MatrixXd AbstractSingleChainManipulability::computeManipulability(const E
 
 
 
-SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, Mode mode, Type type, bool convertMMtoM)
-    : SingleRobotNodeSetManipulability(rns, rns->getTCP(), mode, type, RobotNodePtr(), convertMMtoM)
+
+SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, Mode mode, Type type, Eigen::MatrixXd weightMatrixInit, bool convertMMtoM)
+    : SingleRobotNodeSetManipulability(rns, rns->getTCP(), mode, type, RobotNodePtr(), weightMatrixInit, convertMMtoM)
 {
 }
 
-SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, const RobotNodePtr &node, Mode mode, Type type, const RobotNodePtr &coordSystem, bool convertMMtoM)
-    : AbstractSingleChainManipulability(mode, type), rns(rns), node(node), coordSystem(coordSystem)
+SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, const RobotNodePtr &node, Mode mode, Type type, const RobotNodePtr &coordSystem, Eigen::MatrixXd weightMatrixInit, bool convertMMtoM)
+    : AbstractSingleChainManipulability(mode, type, weightMatrixInit), rns(rns), node(node), coordSystem(coordSystem)
 {
     ik.reset(new DifferentialIK(rns, coordSystem, JacobiProvider::eSVDDamped));
     ik->convertModelScalingtoM(convertMMtoM);
diff --git a/VirtualRobot/Manipulability/SingleChainManipulability.h b/VirtualRobot/Manipulability/SingleChainManipulability.h
index b96a658c86599af19c5adecb8420b4e4c25ca968..0113e0a51aab1fd14d179da7e87dbf194cfd75bf 100644
--- a/VirtualRobot/Manipulability/SingleChainManipulability.h
+++ b/VirtualRobot/Manipulability/SingleChainManipulability.h
@@ -46,14 +46,14 @@ typedef std::shared_ptr<AbstractSingleChainManipulability> AbstractSingleChainMa
 class SingleRobotNodeSetManipulability : public AbstractSingleChainManipulability
 {
 public:
-    SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, Mode mode, Type type, bool convertMMtoM = true);
+    SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, Mode mode, Type type, Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd(), bool convertMMtoM = true);
 
     /**
      * @param rns The robotNodes (i.e., joints) for which the Jacobians should be calculated.
      * @param node
      * @param coordSystem The coordinate system in which the Jacobians are defined. By default the global coordinate system is used.
      */
-    SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, const RobotNodePtr& node, Mode mode, Type type, const RobotNodePtr& coordSystem = RobotNodePtr(), bool convertMMtoM = true);
+    SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, const RobotNodePtr& node, Mode mode, Type type, const RobotNodePtr& coordSystem = RobotNodePtr(), Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd(), bool convertMMtoM = true);
 
     RobotNodeSetPtr getRobotNodeSet();
 
diff --git a/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp b/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp
index 6fc9b3118ee3047436c6a55165fa33644675448e..12f4b64ccc03cc6ded480763a06df14e0e2efa82 100644
--- a/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp
+++ b/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp
@@ -39,17 +39,23 @@ SingleChainManipulabilityTracking::SingleChainManipulabilityTracking(AbstractSin
 }
 
 Eigen::Tensor<double, 3> SingleChainManipulabilityTracking::computeManipulabilityJacobian(const Eigen::MatrixXd &jacobian) {
+    int rows = jacobian.rows(); // task space dim
+    int columns = jacobian.cols(); // joint space dim
+
     Eigen::Tensor<double, 3> derivJ = computeJacobianDerivative(jacobian);
 
     Eigen::array<int, 3> shuffling({1, 0, 2}); // Permutation of first two dimensions
     Eigen::Tensor<double, 3> permDerivJ = derivJ.shuffle(shuffling);
 
+    // Define default weight matrix 
+    if (manipulability->weightMatrix.rows() == 0) {
+        manipulability->weightMatrix.setIdentity(columns, columns);
+    }
+
     // Compute dJ/dq x_2 J
-    Eigen::Tensor<double, 3> dJtdq_J = tensorMatrixProduct(permDerivJ, jacobian);
+    Eigen::Tensor<double, 3> dJtdq_J = tensorMatrixProduct(permDerivJ, jacobian * manipulability->weightMatrix * manipulability->weightMatrix.transpose());
 
     // Compute dJ'/dq x_1 J + dJ/dq x_2 J
-    int rows = jacobian.rows(); // task space dim
-    int columns = jacobian.cols(); // joint space dim
     Eigen::array<int, 2> shufflingTranpose({1, 0}); // for transposing
     Eigen::Tensor<double, 3> manipJ(rows,rows,columns);
     for(int s = 0; s < columns; ++s) {