diff --git a/python/dyndebug.py b/python/dyndebug.py
index e7252083ace85b7f279bbce7d4b6461b72ee31c7..d7ec9babc24f170368a75f2d56ae89554a0d00bf 100644
--- a/python/dyndebug.py
+++ b/python/dyndebug.py
@@ -2,8 +2,10 @@ execfile('/home/nmansard/.pythonrc')
 
 from dynamic_graph import plug
 from dynamic_graph.sot.core import *
+from dynamic_graph.sot.core.math_small_entities import Derivator_of_Matrix
 from dynamic_graph.sot.dynamics import *
 from dynamic_graph.sot.dyninv import *
+import script_shortcuts
 
 # --- Dynamic parameters ---
 hrp2_14_pkgdatarootdir = "/home/nmansard/compil/devgiri/hpp2/share/hrp2_14"
@@ -132,26 +134,79 @@ robot.setRoot(((0.994864055284,0.000210089058006,0.101219896104,0.0274106623863)
 # robot.root [4,4]((0.962169712502,0.000588801121243,0.272450174631,0.13933634465),(1.369076794e-05,0.999997559008,-0.00220947748355,0.143849747317),(-0.272450810525,0.00212962236724,0.962167355792,0.632333943842),(0,0,0,1))
 
 # --- Task Dyn -----------------------------------------
-dyn.createOpPoint('task','right-wrist')
-p6 = FeaturePoint6d('p6')
-p6d= FeaturePoint6d('p6d')
 
-p6d.position.value = ((0,0,-1,0.22),(0,1,0,-0.37),(1,0,0,.74),(0,0,0,1))
-plug(dyn.Jtask,p6.Jq)
-plug(dyn.task,p6.position)
+class MetaTask6d(object):
+    name=''
+    opPoint=''
+    dyn=0
+    derivator=0
+    task=0
+    feature=0
+    featureDes=0
+
+    def opPointExist(self,opPoint):
+        sigsP = filter(lambda x: x.getName().split(':')[-1] == opPoint, self.dyn.signals())
+        sigsJ = filter(lambda x: x.getName().split(':')[-1] == 'J'+opPoint, self.dyn.signals())
+        return len(sigsP)==1 & len(sigsJ)==1
+
+    def defineDynEntities(self,dyn):
+        self.dyn=dyn
+
+    def createOpPoint(self,opPoint,opPointRef = 'right-wrist'):
+        self.opPoint=opPoint
+        if self.opPointExist(opPoint): return
+        self.dyn.createOpPoint(opPoint,opPointRef)
+
+    def createFeatures(self):
+        self.feature    = FeaturePoint6d('feature'+self.name)
+        self.featureDes = FeaturePoint6d('feature'+self.name+'_ref')
+        self.feature.selec.value = '111111'
+        self.feature.frame('current')
+
+    def createTask(self):
+        self.task = TaskDynPD('task'+self.name)
+        self.task.dt.value = 1e-3
+
+    def createGain(self):
+        self.gain = GainAdaptive('gain'+self.name)
+        self.gain.set(1050,45,125e3)
+
+    def plugEverything(self):
+        self.feature.sdes.value = self.featureDes.name
+        plug(self.dyn.signal(self.opPoint),self.feature.signal('position'))
+        plug(self.dyn.signal('J'+self.opPoint),self.feature.signal('Jq'))
+        self.task.add(self.feature.name)
+        plug(self.dyn.velocity,self.task.qdot)
+        plug(self.task.error,self.gain.error)
+        plug(self.gain.gain,self.task.controlGain)
+
+    def __init__(self,name,dyn,opPoint,opPointRef='right-wrist'):
+        self.name=name
+        self.defineDynEntities(dyn)
+        self.createOpPoint(opPoint,opPointRef)
+        self.createFeatures()
+        self.createTask()
+        self.createGain()
+        self.plugEverything()
+
+    @property
+    def ref(self):
+        return self.featureDes.position.value
+
+    @ref.setter
+    def ref(self,m):
+        self.featureDes.position.value = m
+
+task=MetaTask6d('rh',dyn,'task')
+task.ref = ((0,0,-1,0.22),(0,1,0,-0.37),(1,0,0,.74),(0,0,0,1))
 
-p6.sdes.value='p6d'
-p6.selec.value='000111'
-p6.frame('current')
 
-task=TaskDynPD('task')
-task.add('p6')
-plug(dyn.velocity,task.qdot)
-task.dt.value = 1e-3
-task.controlGain.value = 10
 
 # --- Task LFoot -----------------------------------------
 # Move the right foot up.
+
+
+
 dyn.createOpPoint('taskLF','left-ankle')
 featureLF  = FeaturePoint6d('featureLF')
 featureLFd = FeaturePoint6d('featureLFd')
@@ -207,7 +262,7 @@ sot.setSize(30)
 sot.breakFactor.value = 10
 
 plug(dyn.inertiaReal,sot.matrixInertia)
-#plug(dyn.dynamicDrift,sot.dyndrift)
+plug(dyn.dynamicDrift,sot.dyndrift)
 plug(dyn.velocity,sot.velocity)
 
 plug(sot.control,robot.control)
@@ -215,3 +270,62 @@ plug(sot.control,robot.control)
 # For the integration of q = int(int(qddot)).
 plug(sot.acceleration,robot.acceleration)
 
+# ---- CONTACT -----------------------------------------
+# Contact definition
+
+# Left foot contact
+dyn.createJacobian('Jlleg','left-ankle')
+Jll_dot = Derivator_of_Matrix('Jll_dot')
+plug(dyn.Jlleg,Jll_dot.sin)
+Jll_dot.dt.value = 1e3
+
+sot.addContact('ll')
+plug(dyn.Jlleg,sot._ll_J)
+plug(Jll_dot.sout,sot._ll_Jdot)
+sot._ll_p.value = ((0.11,-0.08,-0.08,0.11),(-0.045,-0.045,0.07,0.07),(-0.105,-0.105,-0.105,-0.105))
+
+# Right foot contact
+dyn.createJacobian('Jrleg','right-ankle')
+Jrl_dot = Derivator_of_Matrix('Jrl_dot')
+plug(dyn.Jrleg,Jrl_dot.sin)
+Jrl_dot.dt.value = 1e3
+
+sot.addContact('rl')
+plug(dyn.Jrleg,sot._rl_J)
+plug(Jrl_dot.sout,sot._rl_Jdot)
+#sot._rl_p.value =  ((0.12,-0.09,-0.09,0.12),(-0.08,-0.08,0.05,0.05),(-0.105,-0.105,-0.105,-0.105))
+sot._rl_p.value =  ((0.11,-0.08,-0.08,0.11),(-0.07,-0.07,0.045,0.045),(-0.105,-0.105,-0.105,-0.105))
+
+# constraint order
+#                               19  16
+#     ^ Front +X                +---+
+#     |                 9   6   | R |
+#     +--> Right -Y     +---+   |   |
+#                       |   |   +---+
+#       ^X              | L |  18   17(-8,-45)
+#    Y  |               +---+   (-8,7)
+#    <--+              8    7(-8,-7)
+#                      (-8,45)
+
+# --- TRACE ----------------------------------------------
+
+#tr = TracerRealTime('tr')
+#tr.bufferSize(10485760)
+
+#tr.open('/tmp/','dyn_','.dat')
+#robot.periodicCall addSignal tr.triger
+
+#tr.add('p6.error','position')
+#tr.add('featureCom.error','comerror')
+#tr.add('dyn.com','com')
+#tr.add('sot.zmp')
+#tr.add('sot.qdot')
+#tr.add('robot.state')
+## tr.add('gCom.gain')
+## tr.add('gCom.error','gerror')
+#tr.start()
+
+#tr.add('sot.control')
+
+
+