diff --git a/src/dynamic_graph/sot/dynamics/parser.py b/src/dynamic_graph/sot/dynamics/parser.py
index f5521a8ef3457a9f1f2f94b2c61118ebc26e7f19..fd3ffe02a0eeff935ab8b86da607187d75f3d2cf 100644
--- a/src/dynamic_graph/sot/dynamics/parser.py
+++ b/src/dynamic_graph/sot/dynamics/parser.py
@@ -8,6 +8,7 @@
 
 import xml.dom.minidom as dom
 from dynamic_graph.sot.dynamics.dynamic import Dynamic
+from dynamic_graph.sot import SE3, R3, SO3
 
 class Parser (object):
     """
@@ -282,36 +283,16 @@ class Parser (object):
           symmetric with respect to plane (xz) in global frame.
         """
         # input vector expressed in global frame
-        vector = vector + (1.,)
-        globalLeftVector = mv_mul(self.leftWristPosition, vector)
-        globalRightVector = list(globalLeftVector[:])
-        globalRightVector[1] *= -1.
-        output = mv_mul(inverseHomogeneous(self.rightWristPosition),
-                        globalRightVector)
-        return output[:3]
-
-def mv_mul(matrix, vector):
-    """
-    Matrix vector multiplication
-    """
-    return tuple(map(lambda l: inner_prod(l,vector), matrix))
-
-def inner_prod(v1, v2):
-    """
-    Compute the inner product of two vectors
-    """
-    return reduce(lambda x, y: x + y[0]*y[1], zip(v1,v2),0)
-
-def inverseHomogeneous(matrix):
-    """
-    Compute the inverse of an homogeneous matrix
-    """
-    rotation = map(lambda l:l[:3], matrix[:3])
-    # transpose
-    invRot = tuple(zip(*rotation))
-    # translation part
-    t = map (lambda l:l[3], matrix[:3])
-    invRot_by_t = mv_mul(invRot, t)
-    inverse = map(lambda x : list(x[0])+[-x[1]], zip(invRot, invRot_by_t))
-    inverse.append((0.,0.,0.,1.))
-    return tuple(map(tuple, inverse))
+        vector = R3(vector)
+        globalLeftVector = SE3(self.leftWristPosition) * vector
+        globalRightVector = R3(globalLeftVector)
+        globalRightVector = R3(globalRightVector[0],
+                               -globalRightVector[1],
+                               globalRightVector[2])
+        output = SE3(self.rightWristPosition).inverse()*globalRightVector
+        return tuple(output)
+
+if __name__ == '__main__':
+    p = Parser('dynNao', '/home/florent/devel/nao/model/nao-hpp.kxml')
+    dynNao = p.parse()
+    dynNao.write('/home/florent/tmp/nao2.out')