diff --git a/pom.xml b/pom.xml
index 4999606c072d29270f6feac20ba13e7f23b18596..1654522062d1ec6c0e33c7281558fa0993b05145 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 	<groupId>edu.illinois.cs.cogcomp</groupId>
 	<artifactId>illinois-inference</artifactId>
 	<packaging>jar</packaging>
-	<version>0.6.0</version>
+	<version>0.7.0</version>
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -25,7 +25,7 @@
 		<dependency>
 			<groupId>edu.illinois.cs.cogcomp</groupId>
 			<artifactId>illinois-core-utilities</artifactId>
-			<version>3.0.51</version>
+			<version>3.0.80</version>
 		</dependency>
 		<dependency>
 			<groupId>edu.illinois.cs.cogcomp</groupId>
diff --git a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java
index 406907433b96ca8ba3a0bde2a340df13fb2a3ee3..46ac20e9fea7c756a83808f34797ae6dbe1d10d4 100644
--- a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java
+++ b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java
@@ -1,50 +1,289 @@
 package edu.illinois.cs.cogcomp.infer.ilp;
 
-import gurobi.*;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-
+import static org.junit.Assert.assertTrue;
 
 public class GurobiHookTest {
+    @Test
+    public void testProgram1() throws Exception {
+        GurobiHook ojaHook = new GurobiHook();
+        int[] varInds = new int[2];
+
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(-1.0);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, -3);
+        ojaHook.addLessThanConstraint(varInds, coefs, 4);
+
+        ojaHook.setMaximize(false);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        assertTrue(ojaHook.objectiveValue() == -2.0);
+        assertTrue(ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+    }
+
+    @Test
+    public void testProgram2() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
+
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(-1.0);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, -3);
+        ojaHook.addLessThanConstraint(varInds, coefs, 4);
+
+        ojaHook.setMaximize(true);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == 0);
+        assertTrue(!ojaHook.getBooleanValue(0));
+        assertTrue(!ojaHook.getBooleanValue(1));
+    }
+
 
     @Test
-    public void testGurobi() throws GRBException {
+    public void testProgram3() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
+
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(1.5);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, -3);
+        ojaHook.addLessThanConstraint(varInds, coefs, 4);
+
+        ojaHook.setMaximize(true);
+
         try {
-            GRBEnv env = new GRBEnv();
-            GRBModel model = new GRBModel(env);
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
 
-            // Create variables
-            GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "x");
-            GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "y");
-            GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB.BINARY, "z");
+        ojaHook.printModelInfo();
 
-            // Integrate new variables
-            model.update();
+        assertTrue(ojaHook.objectiveValue() == 3);
+        assertTrue(ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+    }
+
+    @Test
+    public void testProgram4() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
 
-            // Add constraint: x + 2 y + 3 z <= 4
-            GRBLinExpr expr = new GRBLinExpr();
-            expr.addTerm(1.0, x);
-            expr.addTerm(2.0, y);
-            expr.addTerm(3, z);
-            model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0");
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(1.5);
+            varInds[i] = x;
+            i++;
+        }
 
-            // Add constraint: x + y >= 1
-            expr = new GRBLinExpr();
-            expr.addTerm(1.0, x);
-            expr.addTerm(1.0, y);
-            model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1");
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, -3);
+        ojaHook.addLessThanConstraint(varInds, coefs, 4);
 
-            // Optimize model
-            model.optimize();
+        ojaHook.setMaximize(false);
 
-            assertEquals("x", x.get(GRB.StringAttr.VarName));
-            assertEquals(1.0, x.get(GRB.DoubleAttr.X), 0.0);
-            assertEquals(0.0, y.get(GRB.DoubleAttr.X), 0.0);
-            assertEquals(1.0, z.get(GRB.DoubleAttr.X), 0.0);
-            assertEquals(-3.0, model.get(GRB.DoubleAttr.ObjVal), 0.0);
-        } catch (UnsatisfiedLinkError e) {
-            System.out.println("\n\n**** GUROBI LICENSE NOT FOUND! SKIPPING THE TEST ****\n\n");
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
         }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == 0);
+        assertTrue(!ojaHook.getBooleanValue(0));
+        assertTrue(!ojaHook.getBooleanValue(1));
     }
-}
+
+    @Test
+    public void testProgram5() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
+
+        double[] objCoefs = {1.5, 2.5};
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(objCoefs[i]);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, 1);
+        ojaHook.addLessThanConstraint(varInds, coefs, 4);
+
+        ojaHook.setMaximize(true);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == 4);
+        assertTrue(ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+    }
+
+    @Test
+    public void testProgram6() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
+
+        double[] objCoefs = {1.5, 2.5};
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(objCoefs[i]);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, 1);
+        ojaHook.addLessThanConstraint(varInds, coefs, 2);
+
+        ojaHook.setMaximize(false);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == 1.5);
+        assertTrue(ojaHook.getBooleanValue(0));
+        assertTrue(!ojaHook.getBooleanValue(1));
+    }
+
+    @Test
+    public void testProgram7() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[2];
+
+        double[] objCoefs = {1.5, 2.5};
+        int i = 0;
+        while (i< 2) {
+            int x = ojaHook.addBooleanVariable(objCoefs[i]);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 2 };
+        ojaHook.addGreaterThanConstraint(varInds, coefs, 1);
+        ojaHook.addLessThanConstraint(varInds, coefs, 2);
+
+        ojaHook.setMaximize(true);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == 2.5);
+        assertTrue(!ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+    }
+
+    @Test
+    public void testProgram8() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+        int[] varInds = new int[3];
+
+        double[] objCoefs = {-1, -1, -1};
+        int i = 0;
+        while (i< 3) {
+            int x = ojaHook.addBooleanVariable(objCoefs[i]);
+            varInds[i] = x;
+            i++;
+        }
+
+        double[] coefs = { 1, 1, 1};
+        ojaHook.addEqualityConstraint(varInds, coefs, 3);
+        ojaHook.setMaximize(true);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == -3);
+        assertTrue(ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+        assertTrue(ojaHook.getBooleanValue(2));
+    }
+
+    @Test
+    public void testProgram9() throws Exception {
+        OJalgoHook ojaHook = new OJalgoHook();
+
+        double[] objCoefs = {0, -1};
+        ojaHook.addDiscreteVariable(objCoefs);
+        ojaHook.addDiscreteVariable(objCoefs);
+        ojaHook.addDiscreteVariable(objCoefs);
+
+        double[] coefs = { 1, 1, 1};
+        int[] varInds = {1, 3, 5};
+        ojaHook.addEqualityConstraint(varInds, coefs, 3);
+        ojaHook.setMaximize(true);
+
+        try {
+            ojaHook.solve();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        ojaHook.printModelInfo();
+
+        assertTrue(ojaHook.objectiveValue() == -3);
+        assertTrue(!ojaHook.getBooleanValue(0));
+        assertTrue(ojaHook.getBooleanValue(1));
+        assertTrue(!ojaHook.getBooleanValue(2));
+        assertTrue(ojaHook.getBooleanValue(3));
+        assertTrue(!ojaHook.getBooleanValue(4));
+        assertTrue(ojaHook.getBooleanValue(5));
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4dc74e1990f4c481e51088d24dad9fbe0568ece8
--- /dev/null
+++ b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java
@@ -0,0 +1,50 @@
+package edu.illinois.cs.cogcomp.infer.ilp;
+
+import gurobi.*;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class GurobiTest {
+
+    @Test
+    public void testGurobi() throws GRBException {
+        try {
+            GRBEnv env = new GRBEnv();
+            GRBModel model = new GRBModel(env);
+
+            // Create variables
+            GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "x");
+            GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "y");
+            GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB.BINARY, "z");
+
+            // Integrate new variables
+            model.update();
+
+            // Add constraint: x + 2 y + 3 z <= 4
+            GRBLinExpr expr = new GRBLinExpr();
+            expr.addTerm(1.0, x);
+            expr.addTerm(2.0, y);
+            expr.addTerm(3, z);
+            model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0");
+
+            // Add constraint: x + y >= 1
+            expr = new GRBLinExpr();
+            expr.addTerm(1.0, x);
+            expr.addTerm(1.0, y);
+            model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1");
+
+            // Optimize model
+            model.optimize();
+
+            assertEquals("x", x.get(GRB.StringAttr.VarName));
+            assertEquals(1.0, x.get(GRB.DoubleAttr.X), 0.0);
+            assertEquals(0.0, y.get(GRB.DoubleAttr.X), 0.0);
+            assertEquals(1.0, z.get(GRB.DoubleAttr.X), 0.0);
+            assertEquals(-3.0, model.get(GRB.DoubleAttr.ObjVal), 0.0);
+        } catch (UnsatisfiedLinkError e) {
+            System.out.println("\n\n**** GUROBI LICENSE NOT FOUND! SKIPPING THE TEST ****\n\n");
+        }
+    }
+}