diff --git a/src/sandbox/GeneralCompare.java b/src/sandbox/GeneralCompare.java
index 29332aa981890f0b026d7bc1bdca632304f21563..9e7584c7399a163c5ff6ef9ec6c98829ce1735dc 100644
--- a/src/sandbox/GeneralCompare.java
+++ b/src/sandbox/GeneralCompare.java
@@ -1,5 +1,6 @@
 package sandbox;
 
-public interface GeneralCompare<T> {
-	public int eval(T a1, T a2);
+public interface GeneralCompare {
+	public int eval(Comparable a1, Comparable a2);
+
 }
diff --git a/src/sort/GeneralCompare.java b/src/sort/GeneralCompare.java
index 76bf31fcb3c9bc9bbc5c0f8044ffa4dd3449f386..b5d51afd5339dd7d9fafe3cf1ccb308f5742386f 100644
--- a/src/sort/GeneralCompare.java
+++ b/src/sort/GeneralCompare.java
@@ -1,5 +1,5 @@
 package sort;
 
-public interface GeneralCompare<T> {
-	public int compare(T a1, T a2);
+public interface GeneralCompare {
+	public int compare(Comparable a1, Comparable a2);
 }
diff --git a/src/sort/MergeSort.java b/src/sort/MergeSort.java
index b3c7db4a6022fafba612c79f8f87208e5cc3a54c..591ee8cd9bd91e08524f1d04f5c4ad02120bea92 100644
--- a/src/sort/MergeSort.java
+++ b/src/sort/MergeSort.java
@@ -1,35 +1,59 @@
 package sort;
 
+import java.lang.reflect.Array;
+
 public class MergeSort{
-	
+
 	private static Comparable[] aux;
 	
-	public static void merge(Comparable[] x, int lo, int hi, GeneralCompare gc){
+	public static void main(String[] args) {
+		GeneralCompare b1;
+		b1 = (a1, a2) -> (Integer) a1 - (Integer) a2;
+		Integer[] test = {3, 4, 2, 1, 5, 7, 9, 10};
+		sort(test, 0, Array.getLength(test) - 1, b1);
 		
-		int n = hi - lo; 
-		aux = new Comparable[n];
+		for (int i = 0 ; i < (Array.getLength(test) - 1) ; i++) {
+			System.out.println(test[i]);
+		}
+	}
 
+	public static void sort(Comparable[] x, int lo, int hi, GeneralCompare gc) {
+		aux = new Comparable[Array.getLength(x)];
+		sortWrapped(x, 0, Array.getLength(x) - 1, gc);
+	}
+	
+	private static void sortWrapped(Comparable[] x, int lo, int hi, GeneralCompare gc) {
+		int n = hi - lo; 
 		if(n <= 1)
 			return;
-		// Recursively merge each half of the array
-		int mid = (n/2) + 1;
-		merge(x, lo, mid, gc);
-		merge(x, mid+1, hi, gc);
-		
+		// Recursively sort each half of the array
+		int mid = lo + (n/2);
+		sortWrapped(x, lo, mid, gc);
+		sortWrapped(x, mid+1, hi, gc);
+		merge(x, lo, hi, gc);
+	}
+
+	private static void merge(Comparable[] x, int lo, int hi, GeneralCompare gc){
+
+		int n = hi - lo;
+		int mid = lo + (n/2);
+
 		// Fill auxiliary array
-		for(int k = 1; k <= n; k++){
+		System.out.println(n);
+		for(int k = lo; k <= hi; k++){
 			aux[k] = x[k];
 		}
-		
-		//
-		while ((mid < hi) | (lo < mid)) {
-			if (compare(aux[lo], aux[mid]))
-				x[lo++] = mid; 
-				
+
+		int i = 0;
+		// Merging two sorted arrays
+		while ((lo <= mid) & (mid <= hi)) {
+			if (gc.compare(aux[lo], aux[mid]) > 0)
+				x[i++] = aux[mid++]; 
+			else
+				x[i++] = aux[lo++];
 		}
-		
-		
-		
+
+		/*
 		// Is this portion sorting the aux array? Check
 		for(int k = 1; k <= n; k++){
 			if(i > j-1)
@@ -40,9 +64,7 @@ public class MergeSort{
 				x[k] = aux[j++]; 
 			else 
 				x[k] = aux[i++];
-		}
-		
-	}
-
+		}*/
 
+	}
 }