diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/io/GISModelWriter.java b/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/io/GISModelWriter.java
index 71c2f77..d2eefe6 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/io/GISModelWriter.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/io/GISModelWriter.java
@@ -23,12 +23,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.AbstractModelWriter;
 import opennlp.tools.ml.model.ComparablePredicate;
 import opennlp.tools.ml.model.Context;
-import opennlp.tools.ml.model.IndexHashTable;
 
 /**
  * Abstract parent class for GISModel writers.  It provides the persist method
@@ -47,13 +47,13 @@
     Object[] data = model.getDataStructures();
 
     PARAMS = (Context[]) data[0];
-    IndexHashTable<String> pmap = (IndexHashTable<String>) data[1];
+    Map<String, Integer> pmap = (Map<String, Integer>) data[1];
     OUTCOME_LABELS = (String[]) data[2];
     CORRECTION_CONSTANT = (Integer) data[3];
     CORRECTION_PARAM = (Double) data[4];
 
     PRED_LABELS = new String[pmap.size()];
-    pmap.toArray(PRED_LABELS);
+    pmap.keySet().toArray(PRED_LABELS);
   }
 
 
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/quasinewton/QNModel.java b/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/quasinewton/QNModel.java
index bc7cce1..a6676d3 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/quasinewton/QNModel.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/maxent/quasinewton/QNModel.java
@@ -32,7 +32,11 @@
     return this.outcomeNames.length;
   }
 
-  private int getPredIndex(String predicate) {
+  private Integer getPredIndex(String predicate) {
+    
+    if (predicate == null) throw new RuntimeException("ASDASFAS");
+    if (pmap == null) throw new RuntimeException("ASDASFAXXXXXXXS");
+    
     return pmap.get(predicate);
   }
 
@@ -64,9 +68,9 @@
     Context[] params = evalParams.getParams();
 
     for (int ci = 0; ci < context.length; ci++) {
-      int predIdx = getPredIndex(context[ci]);
+      Integer predIdx = getPredIndex(context[ci]);
 
-      if (predIdx >= 0) {
+      if (predIdx != null) {
         double predValue = 1.0;
         if (values != null) predValue = values[ci];
 
@@ -139,7 +143,8 @@
     if (this.pmap.size() != objModel.pmap.size())
       return false;
     String[] pmapArray = new String[pmap.size()];
-    pmap.toArray(pmapArray);
+    pmap.keySet().toArray(pmapArray);
+    
     for (int i = 0; i < this.pmap.size(); i++) {
       if (i != objModel.pmap.get(pmapArray[i]))
         return false;
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractModel.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractModel.java
index 7859012..84e399a 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractModel.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractModel.java
@@ -20,11 +20,13 @@
 package opennlp.tools.ml.model;
 
 import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
 
 public abstract class AbstractModel implements MaxentModel {
 
   /** Mapping between predicates/contexts and an integer representing them. */
-  protected IndexHashTable<String> pmap;
+  protected Map<String, Integer> pmap;
   /** The names of the outcomes. */
   protected String[] outcomeNames;
   /** Parameters for the model. */
@@ -37,7 +39,10 @@
   /** The type of the model. */
   protected ModelType modelType;
 
-  public AbstractModel(Context[] params, String[] predLabels, IndexHashTable<String> pmap, String[] outcomeNames) {
+  public AbstractModel(Context[] params, String[] predLabels, Map<String, Integer> pmap, String[] outcomeNames) {
+    
+    if (pmap == null) throw new RuntimeException("");
+    
     this.pmap = pmap;
     this.outcomeNames =  outcomeNames;
     this.evalParams = new EvalParameters(params,outcomeNames.length);
@@ -54,7 +59,12 @@
   }
 
   private void init(String[] predLabels, String[] outcomeNames){
-    this.pmap = new IndexHashTable<String>(predLabels, 0.7d);
+    this.pmap = new HashMap<String, Integer>(predLabels.length);
+    
+    for (int i = 0; i < predLabels.length; i++) {
+      pmap.put(predLabels[i], i);
+    }
+    
     this.outcomeNames =  outcomeNames;
   }
 
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/IndexHashTable.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/IndexHashTable.java
index 003909f..5849791 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/IndexHashTable.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/IndexHashTable.java
@@ -33,7 +33,10 @@
  * The table is thread safe and can concurrently accessed by multiple threads,
  * thread safety is achieved through immutability. Though its not strictly immutable
  * which means, that the table must still be safely published to other threads.
+ * 
+ * @deprecated use java.util.HashMap instead 
  */
+@Deprecated
 public class IndexHashTable<T> {
 
   private final Object keys[];
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModel.java b/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModel.java
index c5689d8..23ec75a 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModel.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModel.java
@@ -28,7 +28,6 @@
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.Context;
 import opennlp.tools.ml.model.EvalParameters;
-import opennlp.tools.ml.model.IndexHashTable;
 
 /**
  * Class implementing the multinomial Naive Bayes classifier model.
@@ -38,19 +37,8 @@
   protected double[] outcomeTotals;
   protected long vocabulary;
 
-  public NaiveBayesModel(Context[] params, String[] predLabels, IndexHashTable<String> pmap, String[] outcomeNames) {
-    super(params, predLabels, pmap, outcomeNames);
-    outcomeTotals = initOutcomeTotals(outcomeNames, params);
-    this.evalParams = new NaiveBayesEvalParameters(params, outcomeNames.length, outcomeTotals, predLabels.length);
-    modelType = ModelType.NaiveBayes;
-  }
-
-  /**
-   * @deprecated use the constructor with the {@link IndexHashTable} instead!
-   */
-  @Deprecated
   public NaiveBayesModel(Context[] params, String[] predLabels, Map<String, Integer> pmap, String[] outcomeNames) {
-    super(params, predLabels, outcomeNames);
+    super(params, predLabels, pmap, outcomeNames);
     outcomeTotals = initOutcomeTotals(outcomeNames, params);
     this.evalParams = new NaiveBayesEvalParameters(params, outcomeNames.length, outcomeTotals, predLabels.length);
     modelType = ModelType.NaiveBayes;
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModelWriter.java b/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModelWriter.java
index 5ebdbbc..f2152eb 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModelWriter.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesModelWriter.java
@@ -23,12 +23,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.AbstractModelWriter;
 import opennlp.tools.ml.model.ComparablePredicate;
 import opennlp.tools.ml.model.Context;
-import opennlp.tools.ml.model.IndexHashTable;
 
 /**
  * Abstract parent class for NaiveBayes writers.  It provides the persist method
@@ -46,11 +46,11 @@
     Object[] data = model.getDataStructures();
     this.numOutcomes = model.getNumOutcomes();
     PARAMS = (Context[]) data[0];
-    IndexHashTable<String> pmap = (IndexHashTable<String>) data[1];
+    Map<String, Integer> pmap = (Map<String, Integer>) data[1];
     OUTCOME_LABELS = (String[]) data[2];
 
     PRED_LABELS = new String[pmap.size()];
-    pmap.toArray(PRED_LABELS);
+    pmap.keySet().toArray(PRED_LABELS);
   }
 
   protected ComparablePredicate[] sortValues() {
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModel.java b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModel.java
index 40d634e..abc2859 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModel.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModel.java
@@ -28,24 +28,14 @@
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.Context;
 import opennlp.tools.ml.model.EvalParameters;
-import opennlp.tools.ml.model.IndexHashTable;
 
 public class PerceptronModel extends AbstractModel {
 
-  public PerceptronModel(Context[] params, String[] predLabels, IndexHashTable<String> pmap, String[] outcomeNames) {
+  public PerceptronModel(Context[] params, String[] predLabels, Map<String, Integer> pmap, String[] outcomeNames) {
     super(params,predLabels,pmap,outcomeNames);
     modelType = ModelType.Perceptron;
   }
 
-  /**
-   * @deprecated use the constructor with the {@link IndexHashTable} instead!
-   */
-  @Deprecated
-  public PerceptronModel(Context[] params, String[] predLabels, Map<String,Integer> pmap, String[] outcomeNames) {
-    super(params,predLabels,outcomeNames);
-    modelType = ModelType.Perceptron;
-  }
-
   public PerceptronModel(Context[] params, String[] predLabels, String[] outcomeNames) {
     super(params,predLabels,outcomeNames);
     modelType = ModelType.Perceptron;
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModelWriter.java b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModelWriter.java
index f634060..de7d955 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModelWriter.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/PerceptronModelWriter.java
@@ -23,12 +23,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.AbstractModelWriter;
 import opennlp.tools.ml.model.ComparablePredicate;
 import opennlp.tools.ml.model.Context;
-import opennlp.tools.ml.model.IndexHashTable;
 
 /**
  * Abstract parent class for Perceptron writers.  It provides the persist method
@@ -47,11 +47,11 @@
       Object[] data = model.getDataStructures();
       this.numOutcomes = model.getNumOutcomes();
       PARAMS = (Context[]) data[0];
-      IndexHashTable<String> pmap = (IndexHashTable<String>) data[1];
+      Map<String, Integer> pmap = (Map<String, Integer>) data[1];
       OUTCOME_LABELS = (String[])data[2];
 
       PRED_LABELS = new String[pmap.size()];
-      pmap.toArray(PRED_LABELS);
+      pmap.keySet().toArray(PRED_LABELS);
     }
 
     protected ComparablePredicate[] sortValues () {
diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/SimplePerceptronSequenceTrainer.java b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/SimplePerceptronSequenceTrainer.java
index 5651a12..43537c5 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/SimplePerceptronSequenceTrainer.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/ml/perceptron/SimplePerceptronSequenceTrainer.java
@@ -27,7 +27,6 @@
 import opennlp.tools.ml.model.AbstractModel;
 import opennlp.tools.ml.model.DataIndexer;
 import opennlp.tools.ml.model.Event;
-import opennlp.tools.ml.model.IndexHashTable;
 import opennlp.tools.ml.model.MutableContext;
 import opennlp.tools.ml.model.OnePassDataIndexer;
 import opennlp.tools.ml.model.Sequence;
@@ -68,7 +67,7 @@
   private MutableContext[] averageParams;
 
   /** Mapping between context and an integer */
-  private IndexHashTable<String> pmap;
+  private Map<String, Integer> pmap;
 
   private Map<String,Integer> omap;
 
@@ -128,8 +127,12 @@
 
     outcomeList  = di.getOutcomeList();
     predLabels = di.getPredLabels();
-    pmap = new IndexHashTable<String>(predLabels, 0.7d);
+    pmap = new HashMap<String, Integer>();
 
+    for (int i = 0; i < predLabels.length; i++) {
+      pmap.put(predLabels[i], i);
+    }
+    
     display("Incorporating indexed data for training...  \n");
     this.useAverage = useAverage;
     numEvents = di.getNumEvents();
