diff --git a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/SynNode.java b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/SynNode.java
index 1d165af..aadb6f3 100644
--- a/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/SynNode.java
+++ b/opennlp-wsd/src/main/java/opennlp/tools/disambiguator/SynNode.java
@@ -171,4 +171,26 @@
   public long getSynsetID() {
     return this.synset.getOffset();
   }
+  
+  /**
+   * Gets the senses of the nodes
+   * 
+   * @param nodes
+   * @return senses from the nodes
+   */
+  public static ArrayList<WordSense> updateSenses(ArrayList<SynNode> nodes) {
+    ArrayList<WordSense> scoredSenses = new ArrayList<WordSense>();
+
+    for (int i = 0; i < nodes.size(); i++) {
+      ArrayList<WordPOS> sensesComponents = PreProcessor
+          .getAllRelevantWords(PreProcessor.tokenize(nodes.get(i).getGloss()));
+      WordSense wordSense = new WordSense();
+      nodes.get(i).setSenseRelevantWords(sensesComponents);
+      wordSense.setNode(nodes.get(i));
+      wordSense.setId(i);
+      scoredSenses.add(wordSense);
+    }
+    return scoredSenses;
+
+  }
 }
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 dce333b..2b7f2ab 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
@@ -31,9 +31,9 @@
 import opennlp.tools.disambiguator.WSDisambiguator;
 import opennlp.tools.disambiguator.WordPOS;
 import opennlp.tools.disambiguator.WordSense;
+import opennlp.tools.disambiguator.mfs.MFS;
 import opennlp.tools.util.Span;
 import net.sf.extjwnl.JWNLException;
-import net.sf.extjwnl.data.POS;
 import net.sf.extjwnl.data.Synset;
 import net.sf.extjwnl.data.Word;
 
@@ -54,6 +54,7 @@
 
   public Lesk() {
     this(null);
+    
   }
 
   /**
@@ -96,36 +97,6 @@
     return params;
   }
 
-  /*
-   * @return the most frequent senses from wordnet
-   */
-  protected String getMostFrequentSenseKey(WTDLesk wtd) {
-
-    String word = wtd.getRawWord().toLowerCase();
-    POS pos = Constants.getPOS(wtd.getPosTag());
-    String senseKey = null;
-
-    if (pos != null) {
-
-      WordPOS wordPOS = new WordPOS(word, pos);
-
-      ArrayList<Synset> synsets = wordPOS.getSynsets();
-
-      for (Word wd : synsets.get(0).getWords()) {
-        if (wd.getLemma().equals(wtd.getRawWord().split("\\.")[0])) {
-          try {
-            senseKey = wd.getSenseKey();
-            break;
-          } catch (JWNLException e) {
-            e.printStackTrace();
-          }
-          break;
-        }
-      }
-    }
-    return senseKey;
-  }
-
   /**
    * The basic Lesk method where the entire context is considered for overlaps
    * 
@@ -146,7 +117,7 @@
       nodes.add(node);
     }
 
-    ArrayList<WordSense> scoredSenses = updateSenses(nodes);
+    ArrayList<WordSense> scoredSenses = SynNode.updateSenses(nodes);
 
     for (WordSense wordSense : scoredSenses) {
       wordSense.setWTDLesk(wtd);
@@ -212,7 +183,7 @@
       nodes.add(node);
     }
 
-    ArrayList<WordSense> scoredSenses = updateSenses(nodes);
+    ArrayList<WordSense> scoredSenses = SynNode.updateSenses(nodes);
 
     for (WordSense wordSense : scoredSenses) {
       wordSense.setWTDLesk(wtd);
@@ -892,27 +863,7 @@
     return count;
   }
 
-  /**
-   * Gets the senses of the nodes
-   * 
-   * @param nodes
-   * @return senses from the nodes
-   */
-  public ArrayList<WordSense> updateSenses(ArrayList<SynNode> nodes) {
-    ArrayList<WordSense> scoredSenses = new ArrayList<WordSense>();
-
-    for (int i = 0; i < nodes.size(); i++) {
-      ArrayList<WordPOS> sensesComponents = PreProcessor
-          .getAllRelevantWords(PreProcessor.tokenize(nodes.get(i).getGloss()));
-      WordSense wordSense = new WordSense();
-      nodes.get(i).setSenseRelevantWords(sensesComponents);
-      wordSense.setNode(nodes.get(i));
-      wordSense.setId(i);
-      scoredSenses.add(wordSense);
-    }
-    return scoredSenses;
-
-  }
+  
 
   /**
    * Disambiguates an ambiguous word in its context
@@ -1028,13 +979,13 @@
             break;
           }
         }
-        senses[i] = "WordNet" + " " + senseKey + " "
+        senses[i] = params.source.name() + " " + senseKey + " "
             + wsenses.get(i).getScore();
 
       }
     } else { // get the MFS if no overlaps
       senses = new String[1];
-      senses[0] = "WordNet" + " " + this.getMostFrequentSenseKey(wtd) + " -1";
+      senses[0] = params.source.name() + " " + MFS.getMostFrequentSense(wtd) + " -1";
     }
     return senses;
   }
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 ce833f6..e8e0b24 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
@@ -27,25 +27,25 @@
  */
 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
   protected static final LESK_TYPE DFLT_LESK_TYPE = LESK_TYPE.LESK_EXT_EXP_CTXT_WIN;
+  protected static final Source DFLT_SOURCE = Source.WORDNET;
   protected static final int DFLT_WIN_SIZE = 5;
   protected static final int DFLT_DEPTH = 2;
   protected static final double DFLT_IEXP = 0.4;
   protected static final double DFLT_DEXP = 0.4;
 
   protected LESK_TYPE leskType;
+
+  protected Source source;
   protected int win_f_size;
   protected int win_b_size;
   protected int depth;
@@ -165,6 +165,7 @@
    */
   public void setDefaults() {
     this.leskType = LeskParameters.DFLT_LESK_TYPE;
+    this.source = LeskParameters.DFLT_SOURCE;
     this.win_f_size = LeskParameters.DFLT_WIN_SIZE;
     this.win_b_size = LeskParameters.DFLT_WIN_SIZE;
     this.depth = LeskParameters.DFLT_DEPTH;
@@ -177,8 +178,9 @@
     this.fathom_synonyms = true;
   }
 
-  
-  /* (non-Javadoc)
+  /*
+   * (non-Javadoc)
+   * 
    * @see opennlp.tools.disambiguator.WSDParameters#isValid()
    */
   public boolean isValid() {
