diff --git a/src/Config.py b/src/Config.py
index df30721712b509776cf6f0e009e1112c032c197d..212a34506d42ade61949469c8e79f71d00d6ba33 100644
--- a/src/Config.py
+++ b/src/Config.py
@@ -84,40 +84,93 @@ class Config:
                 elif(mvt_type == 'REDUCE'):
                         return self.red()
                 return False
-        
-        def getWordFeat(self, featTuple):
-                container = featTuple[1]
-                index = featTuple[2]
-                tape = featTuple[3]
 
-                
-                if(container == 'B'):
-#                        if((index < self.getBuffer().getLength()) and (index >= 0)):
+        def getWordWithRelativeIndex(self, container, index):
+                if container == 'S' :
+                        if index >= self.getStack().getLength() :
+                                return None
+                        indexInBuffer = self.getStack().array[self.getStack().getLength() - index - 1]
+                        return self.getBuffer().getWord(indexInBuffer)
+                elif container == 'B' :
                         absoluteIndex = self.getBuffer().getCurrentIndex() + index
                         if absoluteIndex < self.getBuffer().getLength() and absoluteIndex >= 0 :
-                                w = self.getBuffer().getWord(absoluteIndex)
-                        else:
-                                #print('word feature ', container, '.', index, '.', tape, ' cannot be interpreted, index ', index, "is out of bound")
-                                return 'NULL'
-
-                else:
-                        if(index < self.getStack().getLength()):
-                                #print('on cherche dans', self.getStack().getLength() - index - 1, "")
-                                w = self.getBuffer().getWord(self.getStack().array[self.getStack().getLength() - index - 1])
-                                if w == None :
-                                        return 'NULL'
-                        else:
-                                #print('word feature ', container, '.', index, '.', tape, ' cannot be interpreted, index ', index, "is out of bound")
-                                return 'NULL'
-                
-                return w.getFeat(tape)
-        
-        #        print('word feature ', container, '.', index, '.', tape, ' cannot be interpreted, tape ', tape, "is unknown")
+                                return self.getBuffer().getWord(absoluteIndex)
+                        else :
+                                return None
+                return None
         
-        #        return 'NULL'
+        def getFeat(self, featTuple):
+                featType = featTuple[0]
+                if(featType == 'W'):
+                        return self.getWordFeat(featTuple)
+                elif(featType == 'C'):
+                        return self.getConfFeat(featTuple)
 
-        
-        
+        def getConfFeat(self, featTuple):
+                featSubType = featTuple[1]
+                if featSubType == 'DIST':
+                        return self.getDistFeat(featTuple)
+                elif featSubType == 'NLDEP':
+                        return self.getNldepFeat(featTuple)
+                elif featSubType == 'NRDEP':
+                        return self.getNrdepFeat(featTuple)
+                elif featSubType == 'LLDEP':
+                        return self.getLldepFeat(featTuple)
+                elif featSubType == 'LRDEP':
+                        return self.getLrdepFeat(featTuple)
+                elif featSubType == 'SH':
+                        return self.getStackHeightFeat(featTuple)
+                return 'NULL'
+
+        def getNlDepFeat(self, featTuple):
+                container = featTuple[2]
+                index = featTuple[3]
+
+                word = self.getWordWithRelativeIndex(containe, index)
+                if word == None :
+                        return 'NULL'
+                return string(len(word.getLeftDaughters()))
+
+        def getNrDepFeat(self, featTuple):
+                container = featTuple[2]
+                index = featTuple[3]
+
+                word = self.getWordWithRelativeIndex(containe, index)
+                if word == None :
+                        return 'NULL'
+                return string(len(word.getRightDaughters()))
+
+
+        def getLlDepFeat(self, featTuple):
+                return 'NULL'
+
+        def getLrDepFeat(self, featTuple):
+                return 'NULL'
+
+        def getStackHeightFeat(self, featTuple):
+                string(self.getStack().getLength())
+
+        def getDistFeat(self, featTuple):
+                containerWord1 = featTuple[1]
+                indexWord1     = featTuple[2]
+                containerWord2 = featTuple[3]
+                indexWord2     = featTuple[4]
+                word1          = self.getWordWithRelativeIndex(containerWord1, indexWord1)
+                word2          = self.getWordWithRelativeIndex(containerWord2, indexWord2)
+                
+                if word1 == None or word2 == None :
+                        return 'NULL'
+                return word1.getIndex() - word2.getIndex() 
+
+        def getWordFeat(self, featTuple):
+                container = featTuple[1]
+                index     = featTuple[2]
+                tape      = featTuple[3]
+
+                word = self.getWordWithRelativeIndex(container, index)
+                if word == None :
+                        return 'NULL'
+                return word.getFeat(tape)
 
         def affiche(self):
                 currentIndex = self.getBuffer().getCurrentIndex()
@@ -141,7 +194,8 @@ class Config:
                 i = 0
                 for f in FeatModel.getFeatArray():
 #                        print(f, '=', self.getWordFeat(f))
-                        featVec.append(self.getWordFeat(f))
+                        featVec.append(self.getFeat(f))
+#                        featVec.append(self.getWordFeat(f))
                         i += 1
 #                print(featVec)
                 return featVec
diff --git a/src/Word.py b/src/Word.py
index 766e7d8de0e8bea24482b57a92b8a72d4b28bc9c..fe92bd51f53c0062cfeee39030add45ff9250a12 100644
--- a/src/Word.py
+++ b/src/Word.py
@@ -3,7 +3,7 @@ class Word:
         self.featDic = {}         # dictionnaire dans lequel sont stockés les word features
         self.leftDaughters = []   # liste des indices des dépendants gauches
         self.rightDaughters = []  # liste des indices des dépendants droits
-        self.index = invalidIndex()
+        self.index = self.invalidIndex()
 
     def getFeat(self, featName):
         if(not featName in self.featDic):