OPENNLP-758 Applied clean up patch. Thanks to  Anthony Beylerian for providing a patch.
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Constants.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Constants.java
index 9909c70..e5a0c38 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Constants.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Constants.java
@@ -22,6 +22,8 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import opennlp.tools.disambiguator.lesk.Lesk;
+import net.sf.extjwnl.JWNLException;
 import net.sf.extjwnl.data.POS;
 
 public class Constants {
@@ -125,22 +127,62 @@
           "you're", "yours", "yourself", "yourselves", "you've", "zero"));
 
   // Print a text in the console
+  public static void printResults(WSDisambiguator disambiguator,
+      String[] results) {
+
+    if (results != null) {
+
+      if (disambiguator instanceof Lesk) {
+        POS pos;
+        long offset;
+        double score;
+        String[] parts;
+
+        for (String result : results) {
+          parts = result.split("@");
+          pos = POS.getPOSForKey(parts[0]);
+          offset = Long.parseLong(parts[1]);
+          score = Double.parseDouble(parts[2]);
+          try {
+            Constants.print("score : " + score + " for : "
+                + Loader.getDictionary().getSynsetAt(pos, offset).getGloss());
+          } catch (JWNLException e) {
+            e.printStackTrace();
+          }
+        }
+      }
+    }
+
+  }
+
   public static void print(Object in) {
-    System.out.println(in);
+    if (in == null) {
+      System.out.println("object is null");
+    } else {
+      System.out.println(in);
+    }
   }
 
   public static void print(Object[] array) {
-    System.out.println(Arrays.asList(array));
+    if (array == null) {
+      System.out.println("object is null");
+    } else {
+      System.out.println(Arrays.asList(array));
+    }
   }
 
   public static void print(Object[][] array) {
-    System.out.print("[");
-    for (int i = 0; i < array.length; i++) {
-      print(array[i]);
-      if (i != array.length - 1) {
-        System.out.print("\n");
+    if (array == null) {
+      System.out.println("object is null");
+    } else {
+      System.out.print("[");
+      for (int i = 0; i < array.length; i++) {
+        print(array[i]);
+        if (i != array.length - 1) {
+          System.out.print("\n");
+        }
+        print("]");
       }
-      print("]");
     }
   }
 
@@ -169,6 +211,15 @@
 
   }
 
+  public static boolean isRelevant(String posTag) {
+    return getPOS(posTag) != null;
+  }
+
+  public static boolean isRelevant(POS pos) {
+    return pos.equals(POS.ADJECTIVE) || pos.equals(POS.ADVERB)
+        || pos.equals(POS.NOUN) || pos.equals(POS.VERB);
+  }
+
   // Check whether a list of arrays contains an array
   public static boolean belongsTo(String[] array, ArrayList<String[]> fullList) {
     for (String[] refArray : fullList) {
@@ -196,5 +247,4 @@
     return true;
 
   }
-
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DataExtractor.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DataExtractor.java
index 0161504..1ad6bad 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DataExtractor.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DataExtractor.java
@@ -41,10 +41,6 @@
 

 public class DataExtractor {

 

-  /**

-   * Constructor

-   */

-

   public DataExtractor() {

     super();

   }

@@ -52,7 +48,6 @@
   /**

    * Extract the dictionary from the dictionary XML file and map the senses

    */

-

   private ArrayList<DictionaryInstance> extractDictionary(String xmlLocation) {

 

     ArrayList<DictionaryInstance> dictionary = new ArrayList<DictionaryInstance>();

@@ -283,9 +278,9 @@
    * Extract the training instances from the training/test set File

    */

 

-  public HashMap<Integer, WTDIMS> extractWSDInstances(String xmlDataSet) {

+  public ArrayList<WTDIMS> extractWSDInstances(String xmlDataSet) {

 

-    HashMap<Integer, WTDIMS> setInstances = new HashMap<Integer, WTDIMS>();

+    ArrayList<WTDIMS> setInstances = new ArrayList<WTDIMS>();

 

     try {

 

@@ -298,8 +293,6 @@
 

       NodeList lexelts = doc.getElementsByTagName("lexelt");

 

-      int index = 0;

-

       for (int i = 0; i < lexelts.getLength(); i++) {

 

         Node nLexelt = lexelts.item(i);

@@ -371,16 +364,12 @@
 

               WTDIMS wordToDisambiguate = new WTDIMS(word, answers, sentence,

                   rawWord);

-              setInstances.put(index, wordToDisambiguate);

-              index++;

+              setInstances.add(wordToDisambiguate);

               // System.out.print(index + "\t");

               // System.out.println(wordToDisambiguate.toString());

             }

-

           }

-

         }

-

       }

 

     } catch (Exception e) {

@@ -390,5 +379,4 @@
     return setInstances;

 

   }

-

 }

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DictionaryInstance.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DictionaryInstance.java
index e53ffa8..ae694f7 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DictionaryInstance.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/DictionaryInstance.java
@@ -20,8 +20,7 @@
 package opennlp.tools.disambiguator;

 

 public class DictionaryInstance {

-

-

+	

   protected int index;

 

   protected String word;

@@ -31,7 +30,6 @@
   protected String[] synset;

   protected String gloss;

 

-

   public DictionaryInstance(int index, String word, String id, String source,

       String[] synset, String gloss) {

     super();

@@ -43,6 +41,10 @@
     this.gloss = gloss;

   }

 

+  /**

+   * Getters and Setters

+   */

+

   public int getIndex() {

     return index;

   }

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/FeaturesExtractor.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/FeaturesExtractor.java
index abcff6c..40c1cbc 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/FeaturesExtractor.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/FeaturesExtractor.java
@@ -20,8 +20,6 @@
 package opennlp.tools.disambiguator;

 

 

-

-

 import java.util.ArrayList;

 

 import opennlp.tools.disambiguator.ims.WTDIMS;

@@ -44,8 +42,6 @@
    *             Collocations: it requires one parameter: "the n-gram"

    * 

    */

-

-  // private methods

   private String[] extractPosOfSurroundingWords(String[] sentence,

       int wordIndex, int windowSize) {

 

@@ -94,7 +90,7 @@
 

   private String[] extractLocalCollocations(String[] sentence, int wordIndex,

       int ngram) {

-    /*

+    /**

      * Here the author used only 11 features of this type. the range was set to

      * 3 (bigrams extracted in a way that they are at max separated by 1 word).

      */

@@ -124,6 +120,7 @@
     return res;

   }

 

+  // public method

   /**

    * This method generates the different set of features related to the IMS

    * approach and store them in the corresponding attributes of the WTDIMS

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Node.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Node.java
index 8481d0c..cb1eccc 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Node.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/Node.java
@@ -31,7 +31,6 @@
 /**
  * Convenience class to access some features.
  */
-
 public class Node {
 
   public Synset parent;
@@ -69,6 +68,10 @@
   public String getSense() {
     return this.synset.getGloss().toString();
   }
+  
+  public long getSenseID() {
+    return this.synset.getOffset();
+  }
 
   public void setHypernyms() {
     // PointerUtils pointerUtils = PointerUtils.get();
@@ -168,5 +171,4 @@
   public ArrayList<WordPOS> getSynonyms() {
     return synonyms;
   }
-
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDParameters.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDParameters.java
new file mode 100644
index 0000000..a08df71
--- /dev/null
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDParameters.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package opennlp.tools.disambiguator;
+
+/**
+ * Disambiguation Parameters
+ *
+ */
+public abstract class WSDParameters {
+  
+  protected boolean isCoarseSense;
+
+  /**
+   * @return if the disambiguation type is coarse grained or fine grained
+   */
+  public boolean isCoarseSense() {
+    return isCoarseSense;
+  }
+
+  public void setCoarseSense(boolean isCoarseSense) {
+    this.isCoarseSense = isCoarseSense;
+  }
+  
+  public WSDParameters(){
+    this.isCoarseSense = true;
+  }
+  
+  /**
+   * @return checks if the parameters are valid or not
+   */
+  public abstract boolean isValid();
+  
+}
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDisambiguator.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDisambiguator.java
index 5b67511..8fc8e72 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDisambiguator.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WSDisambiguator.java
@@ -19,14 +19,49 @@
 
 package opennlp.tools.disambiguator;
 
+import java.security.InvalidParameterException;
 import opennlp.tools.util.Span;
 
+
 /**
- * The interface for word sense disambiguators.
+ * A word sense disambiguator that determines which sense of a word is meant in a particular context.
+ * It is a classification task, where the classes are the different senses of the ambiguous word.
+ * Disambiguation can be achieved in either supervised or un-supervised approaches.
+ * For the moment this component relies on WordNet to retrieve sense definitions.
+ * It returns an array of WordNet sense IDs ordered by their disambiguation score. 
+ * The sense with highest score is the most likely sense of the word.
+ * 
+ * Please see {@link Lesk} for an un-supervised approach.
+ * Please see {@link IMS} for a supervised approach.
+ * 
+ * @see Lesk
+ * @see IMS
  */
 public interface WSDisambiguator {
 
-  public String[] disambiguate(String[] inputText, int inputWordIndex);
+  
+  /**
+   * @return the parameters of the disambiguation algorithm
+   */
+  public WSDParameters getParams();
+  
+  /**
+   * @param the disambiguation implementation specific parameters.
+   * @throws InvalidParameterException
+   */
+  public void setParams(WSDParameters params) throws InvalidParameterException;
+  
+  /**
+   * @param tokenizedContext
+   * @param ambiguousTokenIndex
+   * @return result as an array of WordNet IDs
+   */
+  public String[] disambiguate(String[] tokenizedContext, int ambiguousTokenIndex);
 
-  public String[] disambiguate(String[] inputText, Span[] inputWordSpans);
+  /**
+   * @param tokenizedContext
+   * @param ambiguousTokenIndexSpans
+   * @return result as an array of WordNet IDs
+   */
+  public String[][] disambiguate(String[] tokenizedContext, Span[] ambiguousTokenIndexSpans);
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordPOS.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordPOS.java
index cf7e31d..9bc49ea 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordPOS.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordPOS.java
@@ -28,13 +28,13 @@
 import net.sf.extjwnl.data.POS;
 import net.sf.extjwnl.data.Synset;
 
+// TODO extend Word instead
 public class WordPOS {
 
   private String word;
   private List stems;
   private POS pos;
 
-  // Constructor
   public WordPOS(String word, POS pos) throws IllegalArgumentException {
     if (word == null || pos == null) {
       throw new IllegalArgumentException("Args are null");
@@ -106,5 +106,4 @@
     }
     return false;
   }
-
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordToDisambiguate.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordToDisambiguate.java
index 3eaa1ed..5f27b38 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordToDisambiguate.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/WordToDisambiguate.java
@@ -25,160 +25,141 @@
 
 
 
-
 public class WordToDisambiguate {
-	
-	// TODO Check if it is necessary to add an attribute [word] since the word in the sentence is not necessarily in the base form ??
-		
-	protected String [] sentence;
-	protected String [] posTags;
-	
-	protected int wordIndex;
 
-	protected int sense;
-	
-	protected ArrayList<String> senseID;
-	
-	
-	
-	/**
-	 * Constructor
-	 */
-	
-	
-	public WordToDisambiguate(String[] sentence, int wordIndex, int sense) throws IllegalArgumentException{
-		super();
-		
-		if (wordIndex>sentence.length){
-			throw new IllegalArgumentException("The index is out of bounds !");
-		}
-		
-		this.sentence = sentence;
-		this.posTags = PreProcessor.tag(sentence);
-		
-		this.wordIndex = wordIndex;
-		
-		this.sense = sense;
-	}
-	
-	public WordToDisambiguate(String[] sentence, int wordIndex) {
-		this(sentence,wordIndex,-1);
-	}
-	
-	public WordToDisambiguate() {
-		String[] emptyString = {};
-		int emptyInteger = 0;
-		
-		this.sentence = emptyString;
-		this.wordIndex = emptyInteger;
-		this.sense = -1;
-		
-	}
+  // TODO Check if it is necessary to add an attribute [word] since the word in
+  // the sentence is not necessarily in the base form ??
 
-	
-	/**
-	 * Getters and Setters
-	 */
-	
-	// Sentence
-	public String[] getSentence() {
-		return sentence;
-	}
+  protected String[] sentence;
+  protected String[] posTags;
 
-	public void setSentence(String[] sentence) {
-		this.sentence = sentence;
-	}
+  protected int wordIndex;
 
-	
-	// Sentence Pos-Tags
-	public String[] getPosTags() {
-		return posTags;
-	}
+  protected int sense;
 
-	public void setPosTags(String[] posTags) {
-		this.posTags = posTags;
-	}
+  protected ArrayList<String> senseIDs;
 
-	
-	// Word to disambiguate
-	public int getWordIndex() {
-		return wordIndex;
-	}
+  /**
+   * Constructor
+   */
 
-	public String getRawWord() {
-		
-		/**
-		 * For example, from the word "running" it returns "run.v"
-		 */
-		
-		String wordBaseForm = Loader.getLemmatizer().lemmatize(this.sentence[wordIndex], this.posTags[wordIndex]);
-		
-		String ref = "";
-		
-		if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.VERB)) {
-			ref = wordBaseForm + ".v";
-		} else 	if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.NOUN)) {
-			ref = wordBaseForm + ".n";
-		} else 	if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.ADJECTIVE)) {
-			ref = wordBaseForm + ".a";
-		} else 	if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.ADVERB)) {
-			ref = wordBaseForm + ".r";
-		} else {
-			
-		}
-		
-		return ref;
-		
-	}
-	
-	public String getWord() {
-		return this.sentence[this.wordIndex];
-	}
-	
-	public String getPosTag() {
-		return this.posTags[this.wordIndex];
-	}
-	
-	public void setWordIndex(int wordIndex) {
-		this.wordIndex = wordIndex;
-	}
-	
+  public WordToDisambiguate(String[] sentence, int wordIndex, int sense)
+      throws IllegalArgumentException {
+    super();
 
-	
-	
-	// Word to disambiguate sense
-	public int getSense() {
-		return sense;
-	}
+    if (wordIndex > sentence.length) {
+      throw new IllegalArgumentException("The index is out of bounds !");
+    }
 
-	public void setSense(int sense) {
-		this.sense = sense;
-	}
+    this.sentence = sentence;
+    this.posTags = PreProcessor.tag(sentence);
 
-	
-	
-	// Sense as in the source
-	// TODO fix the conflict between this ID of the sense and that in the attribute [sense]
-	public ArrayList<String> getSenseID() {
-		return senseID;
-	}
+    this.wordIndex = wordIndex;
 
-	public void setSenseID(ArrayList<String> senseID) {
-		this.senseID = senseID;
-	}
-	
-	
+    this.sense = sense;
+  }
 
+  public WordToDisambiguate(String[] sentence, int wordIndex) {
+    this(sentence, wordIndex, -1);
+  }
 
-	/**
-	 * toString
-	 */
-			
-	public String toString() {
-		return (wordIndex + "\t" + getWord() + "\n" + sentence);
-	}
-	
+  public WordToDisambiguate() {
+    String[] emptyString = {};
+    int emptyInteger = 0;
 
-	
+    this.sentence = emptyString;
+    this.wordIndex = emptyInteger;
+    this.sense = -1;
 
+  }
+
+  /**
+   * Getters and Setters
+   */
+
+  // Sentence
+  public String[] getSentence() {
+    return sentence;
+  }
+
+  public void setSentence(String[] sentence) {
+    this.sentence = sentence;
+  }
+
+  // Sentence Pos-Tags
+  public String[] getPosTags() {
+    return posTags;
+  }
+
+  public void setPosTags(String[] posTags) {
+    this.posTags = posTags;
+  }
+
+  // Word to disambiguate
+  public int getWordIndex() {
+    return wordIndex;
+  }
+
+  public String getRawWord() {
+
+    /**
+     * For example, from the word "running" it returns "run.v"
+     */
+
+    String wordBaseForm = Loader.getLemmatizer().lemmatize(
+        this.sentence[wordIndex], this.posTags[wordIndex]);
+
+    String ref = "";
+
+    if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.VERB)) {
+      ref = wordBaseForm + ".v";
+    } else if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.NOUN)) {
+      ref = wordBaseForm + ".n";
+    } else if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.ADJECTIVE)) {
+      ref = wordBaseForm + ".a";
+    } else if (Constants.getPOS(this.posTags[wordIndex]).equals(POS.ADVERB)) {
+      ref = wordBaseForm + ".r";
+    } else {
+
+    }
+
+    return ref;
+
+  }
+
+  public String getWord() {
+    return this.sentence[this.wordIndex];
+  }
+
+  public String getPosTag() {
+    return this.posTags[this.wordIndex];
+  }
+
+  public void setWordIndex(int wordIndex) {
+    this.wordIndex = wordIndex;
+  }
+
+  // Word to disambiguate sense
+  public int getSense() {
+    return sense;
+  }
+
+  public void setSense(int sense) {
+    this.sense = sense;
+  }
+
+  // Sense as in the source
+  // TODO fix the conflict between this ID of the sense and that in the
+  // attribute [sense]
+  public ArrayList<String> getSenseIDs() {
+    return senseIDs;
+  }
+
+  public void setSenseIDs(ArrayList<String> senseIDs) {
+    this.senseIDs = senseIDs;
+  }
+
+  public String toString() {
+    return (wordIndex + "\t" + getWord() + "\n" + sentence);
+  }
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/DefaultIMSContextGenerator.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/DefaultIMSContextGenerator.java
index b1710d7..0c8c4e6 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/DefaultIMSContextGenerator.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/DefaultIMSContextGenerator.java
@@ -34,8 +34,8 @@
   /**

    * Default context generator for IMS.

    */

-  public DefaultIMSContextGenerator() {

 

+  public DefaultIMSContextGenerator() {

   }

 

   /**

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMS.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMS.java
index 961c6c3..a453ecb 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMS.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMS.java
@@ -35,6 +35,7 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.security.InvalidParameterException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.zip.GZIPInputStream;
@@ -51,6 +52,7 @@
 import opennlp.tools.disambiguator.DataExtractor;
 import opennlp.tools.disambiguator.FeaturesExtractor;
 import opennlp.tools.disambiguator.PreProcessor;
+import opennlp.tools.disambiguator.WSDParameters;
 import opennlp.tools.disambiguator.WordPOS;
 import opennlp.tools.disambiguator.WSDisambiguator;
 
@@ -64,17 +66,11 @@
   private FeaturesExtractor fExtractor = new FeaturesExtractor();
   private DataExtractor dExtractor = new DataExtractor();
 
-  /**
-   * PARAMETERS
-   */
 
   private int windowSize;
+  private int word;
   private int ngram;
 
-  /**
-   * Constructors
-   */
-
   public IMS() {
     super();
     windowSize = 3;
@@ -95,11 +91,7 @@
     this.cg = factory.createContextGenerator();
   }
 
-  /**
-   * INTERNAL METHODS
-   */
-
-  protected HashMap<Integer, WTDIMS> extractTrainingData(
+  protected ArrayList<WTDIMS> extractTrainingData(
       String wordTrainingxmlFile,
       HashMap<String, ArrayList<DictionaryInstance>> senses) {
 
@@ -108,18 +100,18 @@
      * etc.)
      */
 
-    HashMap<Integer, WTDIMS> trainingData = dExtractor
+    ArrayList<WTDIMS> trainingData = dExtractor
         .extractWSDInstances(wordTrainingxmlFile);
 
     // HashMap<Integer, WTDIMS> trainingData =
     // dExtractor.extractWSDInstances(wordTrainingxmlFile);
 
-    for (Integer key : trainingData.keySet()) {
-      for (String senseId : trainingData.get(key).getSenseID()) {
+    for (WTDIMS data : trainingData) {
+      for (String senseId : data.getSenseIDs()) {
         for (String dictKey : senses.keySet()) {
           for (DictionaryInstance instance : senses.get(dictKey)) {
             if (senseId.equals(instance.getId())) {
-              trainingData.get(key).setSense(
+              data.setSense(
                   Integer.parseInt(dictKey.split("_")[1]));
               break;
             }
@@ -131,11 +123,11 @@
     return trainingData;
   }
 
-  protected void extractFeature(HashMap<Integer, WTDIMS> words) {
+  protected void extractFeature(ArrayList<WTDIMS> words) {
 
-    for (Integer key : words.keySet()) {
+    for (WTDIMS word : words) {
 
-      fExtractor.extractIMSFeatures(words.get(key), windowSize, ngram);
+      fExtractor.extractIMSFeatures(word, windowSize, ngram);
 
     }
 
@@ -217,18 +209,18 @@
       HashMap<String, ArrayList<DictionaryInstance>> senses = dExtractor
           .extractWordSenses(dict, map, wordTag);
 
-      HashMap<Integer, WTDIMS> instances = extractTrainingData(
+      ArrayList<WTDIMS> instances = extractTrainingData(
           wordTrainingxmlFile, senses);
 
       extractFeature(instances);
 
       ArrayList<Event> events = new ArrayList<Event>();
 
-      for (int key : instances.keySet()) {
+      for (WTDIMS instance : instances) {
 
-        int sense = instances.get(key).getSense();
+        int sense = instance.getSense();
 
-        String[] context = cg.getContext(instances.get(key));
+        String[] context = cg.getContext(instance);
 
         Event ev = new Event(sense + "", context);
 
@@ -338,9 +330,16 @@
   }
 
   @Override
-  public String[] disambiguate(String[] inputText, Span[] inputWordSpans) {
-    // TODO Auto-generated method stub
+  public String[][] disambiguate(String[] inputText, Span[] inputWordSpans) {
     return null;
   }
 
+  @Override
+  public WSDParameters getParams() {
+    return null;
+  }
+
+  @Override
+  public void setParams(WSDParameters params) throws InvalidParameterException {
+  }
 }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSContextGenerator.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSContextGenerator.java
index 7b88474..cb670e4 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSContextGenerator.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSContextGenerator.java
@@ -25,5 +25,4 @@
 public interface IMSContextGenerator {

 

   public String[] getContext(WTDIMS word);

-

 }

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSFactory.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSFactory.java
index 5c078f6..81eac3f 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSFactory.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/IMSFactory.java
@@ -99,4 +99,3 @@
   public void validateArtifactMap() throws InvalidFormatException {

   }

 }

-

diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/WTDIMS.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/WTDIMS.java
index ec9fd10..e40c75a 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/WTDIMS.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/ims/WTDIMS.java
@@ -19,8 +19,6 @@
 
 package opennlp.tools.disambiguator.ims;
 
-
-
 import java.util.ArrayList;
 
 import opennlp.tools.disambiguator.PreProcessor;
@@ -34,7 +32,6 @@
 
   public WTDIMS(String[] sentence, int word, int sense) {
     super(sentence, word, sense);
-
   }
 
   public WTDIMS(String[] sentence, int word) {
@@ -57,8 +54,7 @@
       }
     }
 
-    this.senseID = xmlAnswers;
-
+    this.senseIDs = xmlAnswers;
   }
 
   public String[] getPosOfSurroundingWords() {
@@ -85,4 +81,3 @@
     this.localCollocations = localCollocations;
   }
 }
-
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/Lesk.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/Lesk.java
index ecb1ec0..0b02df2 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/Lesk.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/Lesk.java
@@ -21,13 +21,13 @@
 
 import java.security.InvalidParameterException;
 import java.util.ArrayList;
-
 import java.util.Collections;
 
 import opennlp.tools.disambiguator.Constants;
 import opennlp.tools.disambiguator.Loader;
 import opennlp.tools.disambiguator.Node;
 import opennlp.tools.disambiguator.PreProcessor;
+import opennlp.tools.disambiguator.WSDParameters;
 import opennlp.tools.disambiguator.WSDisambiguator;
 import opennlp.tools.disambiguator.WordPOS;
 import opennlp.tools.disambiguator.WordSense;
@@ -35,36 +35,68 @@
 import net.sf.extjwnl.data.Synset;
 
 /**
- * Class for the Lesk algorithm and variants.
+ * Implementation of the <b>Overlap Of Senses</b> approach originally proposed by Lesk.
+ * The main idea is to check for word overlaps in the sense definitions of the surrounding context. 
+ * An overlap is when two words have similar stems.
+ * The more overlaps a word has the higher its score.
+ * Different variations of the approach are included in this class.
+ * 
  */
-
 public class Lesk implements WSDisambiguator {
 
+  /**
+   * The lesk specific parameters
+   */
   protected LeskParameters params;
-
-  public Loader loader;
-
+  
   public Lesk() {
     this(null);
   }
 
+  /**
+   * Initializes the loader object and sets the input parameters
+   * @param Input Parameters
+   * @throws InvalidParameterException
+   */
   public Lesk(LeskParameters params) throws InvalidParameterException {
-    loader = new Loader();
+    Loader loader = new Loader();
     this.setParams(params);
   }
+  
 
-  public void setParams(LeskParameters params) throws InvalidParameterException {
+  /**
+   * If the parameters are null set the default ones, else only set them if they valid.
+   * Invalid parameters will return a exception
+   * 
+   * @param Input parameters
+   * @throws InvalidParameterException
+   */
+  @Override
+  public void setParams(WSDParameters params) throws InvalidParameterException {
     if (params == null) {
       this.params = new LeskParameters();
     } else {
       if (params.isValid()) {
-        this.params = params;
+        this.params = (LeskParameters) params;
       } else {
         throw new InvalidParameterException("wrong params");
       }
     }
   }
 
+  /** 
+   * @return the parameter settings
+   */
+  public LeskParameters getParams() {
+    return params;
+  }
+
+  /**
+   * The basic Lesk method where the entire context is considered for overlaps
+   * 
+   * @param The word to disambiguate 
+   * @return The array of WordSenses with their scores
+   */
   public ArrayList<WordSense> basic(WTDLesk wtd) {
 
     ArrayList<WordPOS> relvWords = PreProcessor.getAllRelevantWords(wtd);
@@ -98,14 +130,31 @@
     return scoredSenses;
   }
 
+  /**
+   * The basic Lesk method but applied to a default context windows
+   * @param The word to disambiguate 
+   * @return The array of WordSenses with their scores
+   */
   public ArrayList<WordSense> basicContextual(WTDLesk wtd) {
     return this.basicContextual(wtd, LeskParameters.DFLT_WIN_SIZE);
   }
 
+  /**
+   * The basic Lesk method but applied to a custom context windows
+   * @param The word to disambiguate 
+   * @param windowSize
+   * @return The array of WordSenses with their scores
+   */
   public ArrayList<WordSense> basicContextual(WTDLesk wtd, int windowSize) {
     return this.basicContextual(wtd, windowSize, windowSize);
   }
 
+  /**
+   * The basic Lesk method but applied to a context windows set by custom backward and forward window lengths
+   * @param wtd the word to disambiguate 
+   * @param windowBackward 
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> basicContextual(WTDLesk wtd, int windowBackward,
       int windowForward) {
 
@@ -146,6 +195,19 @@
     return scoredSenses;
   }
 
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps across the entire context
+   * The scoring function uses linear weights.
+   * @param wtd the word to disambiguate
+   * @param depth how deep to go into each feature tree
+   * @param depthScoreWeight the weighing per depth level
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extended(WTDLesk wtd, int depth,
       double depthScoreWeight, boolean includeSynonyms,
       boolean includeHypernyms, boolean includeHyponyms,
@@ -156,6 +218,19 @@
 
   }
 
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a default context window
+   * The scoring function uses linear weights.
+   * @param wtd the word to disambiguate 
+   * @param depth how deep to go into each feature tree
+   * @param depthScoreWeight the weighing per depth level
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedContextual(WTDLesk wtd, int depth,
       double depthScoreWeight, boolean includeSynonyms,
       boolean includeHypernyms, boolean includeHyponyms,
@@ -167,6 +242,20 @@
 
   }
 
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a custom context window
+   * The scoring function uses linear weights.
+   * @param wtd the word to disambiguate 
+   * @param windowSize the custom context window size
+   * @param depth how deep to go into each feature tree
+   * @param depthScoreWeight the weighing per depth level
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedContextual(WTDLesk wtd, int windowSize,
       int depth, double depthScoreWeight, boolean includeSynonyms,
       boolean includeHypernyms, boolean includeHyponyms,
@@ -177,6 +266,22 @@
         includeMeronyms, includeHolonyms);
   }
 
+
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a custom context window
+   * The scoring function uses linear weights.
+   * @param wtd the word to disambiguate 
+   * @param windowBackward the custom context backward window size
+   * @param windowForward the custom context forward window size
+   * @param depth how deep to go into each feature tree
+   * @param depthScoreWeight the weighing per depth level
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedContextual(WTDLesk wtd,
       int windowBackward, int windowForward, int depth,
       double depthScoreWeight, boolean includeSynonyms,
@@ -236,6 +341,21 @@
 
   }
 
+  
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in all the context.
+   * The scoring function uses exponential weights.
+   * @param wtd the word to disambiguate 
+   * @param depth how deep to go into each feature tree
+   * @param intersectionExponent
+   * @param depthExponent
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedExponential(WTDLesk wtd, int depth,
       double intersectionExponent, double depthExponent,
       boolean includeSynonyms, boolean includeHypernyms,
@@ -246,7 +366,21 @@
         includeMeronyms, includeHolonyms);
 
   }
-
+  
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a default window in the context.
+   * The scoring function uses exponential weights.
+   * @param wtd the word to disambiguate 
+   * @param depth how deep to go into each feature tree
+   * @param intersectionExponent
+   * @param depthExponent
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedExponentialContextual(WTDLesk wtd,
       int depth, double intersectionExponent, double depthExponent,
       boolean includeSynonyms, boolean includeHypernyms,
@@ -256,7 +390,22 @@
         depth, intersectionExponent, depthExponent, includeSynonyms,
         includeHypernyms, includeHyponyms, includeMeronyms, includeHolonyms);
   }
-
+  
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a custom window in the context.
+   * The scoring function uses exponential weights.
+   * @param wtd the word to disambiguate 
+   * @param windowSize 
+   * @param depth how deep to go into each feature tree
+   * @param intersectionExponent
+   * @param depthExponent
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedExponentialContextual(WTDLesk wtd,
       int windowSize, int depth, double intersectionExponent,
       double depthExponent, boolean includeSynonyms, boolean includeHypernyms,
@@ -267,6 +416,22 @@
         includeHyponyms, includeMeronyms, includeHolonyms);
   }
 
+  /**
+   * An extended version of the Lesk approach that takes into consideration semantically related feature overlaps in a custom window in the context.
+   * The scoring function uses exponential weights.
+   * @param wtd the word to disambiguate 
+   * @param windowBackward
+   * @param windowForward
+   * @param depth
+   * @param intersectionExponent
+   * @param depthExponent
+   * @param includeSynonyms
+   * @param includeHypernyms
+   * @param includeHyponyms
+   * @param includeMeronyms
+   * @param includeHolonyms
+   * @return the array of WordSenses with their scores
+   */
   public ArrayList<WordSense> extendedExponentialContextual(WTDLesk wtd,
       int windowBackward, int windowForward, int depth,
       double intersectionExponent, double depthExponent,
@@ -327,6 +492,15 @@
 
   }
 
+  /**
+   * Recursively score the hypernym tree linearly
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param depthScoreWeight
+   */
   private void fathomHypernyms(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double depthScoreWeight) {
@@ -350,6 +524,16 @@
     }
   }
 
+  /**
+   * Recursively score the hypernym tree exponentially 
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param intersectionExponent
+   * @param depthScoreExponent
+   */
   private void fathomHypernymsExponential(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double intersectionExponent, double depthScoreExponent) {
@@ -374,6 +558,15 @@
     }
   }
 
+  /**
+   * Recursively score the hyponym tree linearly
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param depthScoreWeight
+   */
   private void fathomHyponyms(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double depthScoreWeight) {
@@ -398,6 +591,16 @@
     }
   }
 
+  /**
+   * Recursively score the hyponym tree exponentially
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param intersectionExponent
+   * @param depthScoreExponent
+   */
   private void fathomHyponymsExponential(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double intersectionExponent, double depthScoreExponent) {
@@ -422,6 +625,15 @@
     }
   }
 
+  /**
+   * Recursively score the meronym tree linearly
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param depthScoreWeight
+   */
   private void fathomMeronyms(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double depthScoreWeight) {
@@ -446,6 +658,16 @@
     }
   }
 
+  /**
+   * Recursively score the meronym tree exponentially
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param intersectionExponent
+   * @param depthScoreExponent
+   */
   private void fathomMeronymsExponential(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double intersectionExponent, double depthScoreExponent) {
@@ -470,6 +692,15 @@
     }
   }
 
+  /**
+   * Recursively score the holonym tree linearly
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param depthScoreWeight
+   */
   private void fathomHolonyms(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double depthScoreWeight) {
@@ -494,6 +725,16 @@
     }
   }
 
+  /**
+   * Recursively score the holonym tree exponentially
+   * @param wordSense
+   * @param child
+   * @param relvWords
+   * @param depth
+   * @param maxDepth
+   * @param intersectionExponent
+   * @param depthScoreExponent
+   */
   private void fathomHolonymsExponential(WordSense wordSense, Synset child,
       ArrayList<WordPOS> relvWords, int depth, int maxDepth,
       double intersectionExponent, double depthScoreExponent) {
@@ -518,6 +759,12 @@
     }
   }
 
+  /**
+   * Checks if the feature should be counted in the score
+   * @param featureSynsets
+   * @param relevantWords
+   * @return count of features to consider
+   */
   private int assessFeature(ArrayList<Synset> featureSynsets,
       ArrayList<WordPOS> relevantWords) {
     int count = 0;
@@ -540,25 +787,32 @@
     return count;
   }
 
+  /**
+   * Checks if the synonyms should be counted in the score
+   * @param synonyms
+   * @param relevantWords
+   * @return count of synonyms to consider
+   */
   private int assessSynonyms(ArrayList<WordPOS> synonyms,
       ArrayList<WordPOS> relevantWords) {
     int count = 0;
 
     for (WordPOS synonym : synonyms) {
       for (WordPOS sentenceWord : relevantWords) {
-        // TODO try to switch to lemmatizer
         if (sentenceWord.isStemEquivalent(synonym)) {
           count = count + 1;
         }
       }
-
     }
-
     return count;
   }
 
+  /**
+   * Gets the senses of the nodes
+   * @param nodes
+   * @return senses from the nodes
+   */
   public ArrayList<WordSense> updateSenses(ArrayList<Node> nodes) {
-
     ArrayList<WordSense> scoredSenses = new ArrayList<WordSense>();
 
     for (int i = 0; i < nodes.size(); i++) {
@@ -573,12 +827,25 @@
     return scoredSenses;
 
   }
-
-  // disambiguates a WTDLesk and returns an array of sense indexes from WordNet
-  // ordered by their score
+  
+  /**
+   * Disambiguates an ambiguous word in its context
+   * 
+   * @param tokenizedContext
+   * @param ambiguousTokenIndex
+   * @return array of sense indexes from WordNet ordered by their score.
+   * The result format is <b>POS</b>@<b>SenseID</b>@<b>Sense Score</b> 
+   * If the input token is non relevant a null is returned.
+   */
   @Override
-  public String[] disambiguate(String[] inputText, int inputWordIndex) {
-    WTDLesk wtd = new WTDLesk(inputText, inputWordIndex);
+  public String[] disambiguate(String[] tokenizedContext, int ambiguousTokenIndex) {
+    
+    WTDLesk wtd = new WTDLesk(tokenizedContext, ambiguousTokenIndex);
+    // if the word is not relevant return null
+    if (!Constants.isRelevant(wtd.getPosTag())){
+      return null ;
+    }
+    
     ArrayList<WordSense> wsenses = null;
 
     switch (this.params.leskType) {
@@ -654,15 +921,32 @@
         LeskParameters.DFLT_DEXP, true, true, true, true, true);
     Collections.sort(wsenses);
 
+    // TODO modify to longs but for now we have strings in the data for coarsing
     String[] senses = new String[wsenses.size()];
     for (int i = 0; i < wsenses.size(); i++) {
-      senses[i] = wsenses.get(i).getSense();
+      senses[i] = Constants.getPOS(wsenses.get(i).getWTDLesk().getPosTag())
+          .getKey()
+          + "@"
+          + Long.toString(wsenses.get(i).getNode().getSenseID())
+          + "@"
+          + wsenses.get(i).getScore();
     }
     return senses;
   }
 
-  @Override
-  public String[] disambiguate(String[] inputText, Span[] inputWordSpans) {
+  
+  /**
+   * Disambiguates an ambiguous word in its context
+   * The user can set a span of inputWords from the tokenized input
+   *  
+   * @param inputText
+   * @param inputWordSpans
+   * @return array of array of sense indexes from WordNet ordered by their score.
+   * The result format is <b>POS</b>@<b>SenseID</b>@<b>Sense Score</b> 
+   * If the input token is non relevant a null is returned.
+   */
+  @Override 
+  public String[][] disambiguate(String[] tokenizedContext, Span[] ambiguousTokenSpans) {
     // TODO need to work on spans
     return null;
   }
diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/LeskParameters.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/LeskParameters.java
index 3d1834a..d0aa8f5 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/LeskParameters.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/lesk/LeskParameters.java
@@ -19,11 +19,23 @@
 
 package opennlp.tools.disambiguator.lesk;
 
-public class LeskParameters {
+import opennlp.tools.disambiguator.WSDParameters;
 
-  // VARIATIONS
+/**
+ * Lesk specific parameter set
+ *
+ */
+public class LeskParameters extends WSDParameters {
+
+  
+  /**
+   * Enum of all types of implemented variations of Lesk
+   *
+   */
   public static enum LESK_TYPE {
-    LESK_BASIC, LESK_BASIC_CTXT, LESK_BASIC_CTXT_WIN, LESK_BASIC_CTXT_WIN_BF, LESK_EXT, LESK_EXT_CTXT, LESK_EXT_CTXT_WIN, LESK_EXT_CTXT_WIN_BF, LESK_EXT_EXP, LESK_EXT_EXP_CTXT, LESK_EXT_EXP_CTXT_WIN, LESK_EXT_EXP_CTXT_WIN_BF,
+    LESK_BASIC, LESK_BASIC_CTXT, LESK_BASIC_CTXT_WIN, LESK_BASIC_CTXT_WIN_BF,
+    LESK_EXT, LESK_EXT_CTXT, LESK_EXT_CTXT_WIN, LESK_EXT_CTXT_WIN_BF, LESK_EXT_EXP,
+    LESK_EXT_EXP_CTXT, LESK_EXT_EXP_CTXT_WIN, LESK_EXT_EXP_CTXT_WIN_BF,
   }
 
   // DEFAULTS
@@ -33,25 +45,124 @@
   protected static final double DFLT_IEXP = 0.3;
   protected static final double DFLT_DEXP = 0.3;
 
-  public LESK_TYPE leskType;
-  public int win_f_size;
-  public int win_b_size;
-  public int depth;
+  protected LESK_TYPE leskType;
+  protected int win_f_size;
+  protected int win_b_size;
+  protected int depth;
 
-  public boolean fathom_synonyms;
-  public boolean fathom_hypernyms;
-  public boolean fathom_hyponyms;
-  public boolean fathom_meronyms;
-  public boolean fathom_holonyms;
+  protected boolean fathom_synonyms;
+  protected boolean fathom_hypernyms;
+  protected boolean fathom_hyponyms;
+  protected boolean fathom_meronyms;
+  protected boolean fathom_holonyms;
 
-  public double depth_weight;
-  public double iexp;
-  public double dexp;
+  protected double depth_weight;
+  protected double iexp;
+  protected double dexp;
+
+  public LESK_TYPE getLeskType() {
+    return leskType;
+  }
+
+  public void setLeskType(LESK_TYPE leskType) {
+    this.leskType = leskType;
+  }
+
+  public int getWin_f_size() {
+    return win_f_size;
+  }
+
+  public void setWin_f_size(int win_f_size) {
+    this.win_f_size = win_f_size;
+  }
+
+  public int getWin_b_size() {
+    return win_b_size;
+  }
+
+  public void setWin_b_size(int win_b_size) {
+    this.win_b_size = win_b_size;
+  }
+
+  public int getDepth() {
+    return depth;
+  }
+
+  public void setDepth(int depth) {
+    this.depth = depth;
+  }
+
+  public boolean isFathom_synonyms() {
+    return fathom_synonyms;
+  }
+
+  public void setFathom_synonyms(boolean fathom_synonyms) {
+    this.fathom_synonyms = fathom_synonyms;
+  }
+
+  public boolean isFathom_hypernyms() {
+    return fathom_hypernyms;
+  }
+
+  public void setFathom_hypernyms(boolean fathom_hypernyms) {
+    this.fathom_hypernyms = fathom_hypernyms;
+  }
+
+  public boolean isFathom_hyponyms() {
+    return fathom_hyponyms;
+  }
+
+  public void setFathom_hyponyms(boolean fathom_hyponyms) {
+    this.fathom_hyponyms = fathom_hyponyms;
+  }
+
+  public boolean isFathom_meronyms() {
+    return fathom_meronyms;
+  }
+
+  public void setFathom_meronyms(boolean fathom_meronyms) {
+    this.fathom_meronyms = fathom_meronyms;
+  }
+
+  public boolean isFathom_holonyms() {
+    return fathom_holonyms;
+  }
+
+  public void setFathom_holonyms(boolean fathom_holonyms) {
+    this.fathom_holonyms = fathom_holonyms;
+  }
+
+  public double getDepth_weight() {
+    return depth_weight;
+  }
+
+  public void setDepth_weight(double depth_weight) {
+    this.depth_weight = depth_weight;
+  }
+
+  public double getIexp() {
+    return iexp;
+  }
+
+  public void setIexp(double iexp) {
+    this.iexp = iexp;
+  }
+
+  public double getDexp() {
+    return dexp;
+  }
+
+  public void setDexp(double dexp) {
+    this.dexp = dexp;
+  }
 
   public LeskParameters() {
     this.setDefaults();
   }
 
+  /**
+   * Sets default parameters
+   */
   public void setDefaults() {
     this.leskType = LeskParameters.DFLT_LESK_TYPE;
     this.win_f_size = LeskParameters.DFLT_WIN_SIZE;
@@ -66,8 +177,10 @@
     this.fathom_synonyms = true;
   }
 
-  // Parameter Validation
-  // TODO make isSet for semantic feature booleans
+  
+  /* (non-Javadoc)
+   * @see opennlp.tools.disambiguator.WSDParameters#isValid()
+   */
   public boolean isValid() {
 
     switch (this.leskType) {
@@ -81,16 +194,13 @@
     case LESK_EXT:
     case LESK_EXT_CTXT:
       return (this.depth >= 0) && (this.depth_weight >= 0);
-
     case LESK_EXT_CTXT_WIN:
     case LESK_EXT_CTXT_WIN_BF:
       return (this.depth >= 0) && (this.depth_weight >= 0)
           && (this.win_b_size >= 0) && (this.win_f_size >= 0);
-
     case LESK_EXT_EXP:
     case LESK_EXT_EXP_CTXT:
       return (this.depth >= 0) && (this.dexp >= 0) && (this.iexp >= 0);
-
     case LESK_EXT_EXP_CTXT_WIN:
     case LESK_EXT_EXP_CTXT_WIN_BF:
       return (this.depth >= 0) && (this.dexp >= 0) && (this.iexp >= 0)
diff --git a/opennlp-wsd/src/test/java/opennlp/tools/disambiguator/Tester.java b/opennlp-wsd/src/test/java/opennlp/tools/disambiguator/Tester.java
index c78ba80..adae7ab 100644
--- a/opennlp-wsd/src/test/java/opennlp/tools/disambiguator/Tester.java
+++ b/opennlp-wsd/src/test/java/opennlp/tools/disambiguator/Tester.java
@@ -45,40 +45,47 @@
 
     try {
       TokenizerModel = new TokenizerModel(new FileInputStream(
-          "src\\test\\resources\\opennlp\\tools\\disambiguator\\en-token.bin"));
+          "src\\test\\resources\\models\\en-token.bin"));
       Tokenizer tokenizer = new TokenizerME(TokenizerModel);
 
       String[] words = tokenizer.tokenize(sentence);
-
-      POSModel posTaggerModel = new POSModelLoader()
-          .load(new File(
-              "src\\test\\resources\\opennlp\\tools\\disambiguator\\en-pos-maxent.bin"));
-      POSTagger tagger = new POSTaggerME(posTaggerModel);
-
-      Constants.print("\ntokens :");
+//
+//      POSModel posTaggerModel = new POSModelLoader()
+//          .load(new File(
+//              "src\\test\\resources\\models\\en-pos-maxent.bin"));
+////      POSTagger tagger = new POSTaggerME(posTaggerModel);
+//
+//      Constants.print("\ntokens :");
       Constants.print(words);
-      Constants.print(tagger.tag(words));
+      
+      int wordIndex= 6;
+//      Constants.print(tagger.tag(words));
 
       Constants.print("\ntesting default lesk :");
       Lesk lesk = new Lesk();
-      Constants.print(lesk.disambiguate(words, 6));
+      Constants.print(lesk.disambiguate(words, wordIndex));
+      Constants.printResults(lesk,lesk.disambiguate(words, wordIndex));
+      
 
       Constants.print("\ntesting with null params :");
       lesk.setParams(null);
-      Constants.print(lesk.disambiguate(words, 6));
+      Constants.print(lesk.disambiguate(words, wordIndex));
+      Constants.printResults(lesk,lesk.disambiguate(words, wordIndex));
 
       Constants.print("\ntesting with default params");
       lesk.setParams(new LeskParameters());
-      Constants.print(lesk.disambiguate(words, 6));
+      Constants.print(lesk.disambiguate(words, wordIndex));
+      Constants.printResults(lesk,lesk.disambiguate(words, wordIndex));
 
       Constants.print("\ntesting with custom params :");
       LeskParameters leskParams = new LeskParameters();
-      leskParams.leskType = LeskParameters.LESK_TYPE.LESK_BASIC_CTXT_WIN_BF;
-      leskParams.win_b_size = 4;
-      leskParams.depth = 3;
+      leskParams.setLeskType(LeskParameters.LESK_TYPE.LESK_BASIC_CTXT_WIN_BF);
+      leskParams.setWin_b_size(4);
+      leskParams.setDepth(3);
       lesk.setParams(leskParams);
-      Constants.print(lesk.disambiguate(words, 6));
-
+      Constants.print(lesk.disambiguate(words, wordIndex));
+      Constants.printResults(lesk,lesk.disambiguate(words, wordIndex));
+     
       /*
        * Constants.print("\ntesting with wrong params should throw exception :");
        * LeskParameters leskWrongParams = new LeskParameters();