diff --git a/a0/src/com/CS3310/a0/Controller.java b/a0/src/com/CS3310/a0/Controller.java
index 1dd381f171d85522d00bbc21ba7e99f8c3db6acf..7a8f4354bf433afd930e7d30d16b8f43eab37464 100644
--- a/a0/src/com/CS3310/a0/Controller.java
+++ b/a0/src/com/CS3310/a0/Controller.java
@@ -2,6 +2,7 @@ package com.CS3310.a0;
 
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.Random;
 import java.util.Scanner;
 
@@ -12,14 +13,13 @@ import java.util.Scanner;
 public class Controller {
 
     //region Variables
-    private int arrayIndex1;
-    private int arrayIndex2;
     private int arrayDim1;
     private int arrayDim2;
-    private String tempString;
-    private char[][] charArray;
+    private char[][] unsortedArray;
+    private char[] sortedArray;
     private Random random = new Random();
     private Scanner reader = new Scanner(System.in);
+    private ComputeTime computeTime = new ComputeTime();
 
     //endregion Variables
 
@@ -32,35 +32,38 @@ public class Controller {
      */
     public Controller() {
         boolean runProgram = true;
+        String userInputString;
 
         while (arrayDim1 < 1 || arrayDim2 < 1) {
             GetArrayDimensions();
         }
 
-        CreateArray();
+        RunCore();
         PrintHelp();
 
         while (runProgram) {
-            tempString = GetUserInput();
-            switch (tempString) {
-                case "help":
-                    PrintHelp();
-                    break;
-                case "dimensions":
-                    GetArrayDimensions();
-                    CreateArray();
-                    break;
-                case "sort":
-                    Sort2DArray();
-                    break;
-                case "print":
-                    Print2DArray();
-                    break;
-                case "exit":
+            //userInputString = GetUserInput();
+//            switch (tempString) {
+//                case "help":
+//                    PrintHelp();
+//                    break;
+//                case "dimensions":
+//                    GetArrayDimensions();
+//                    CreateArray();
+//                    break;
+//                case "sort":
+//                    SortArray();
+//                    break;
+//                case "print":
+//                    PrintUnsortedArray();
+//                    break;
+//                case "exit":
                     runProgram = false;
-                default:
-                    SearchName(tempString);
-            }
+//                    break;
+//                default:
+//                    SearchName(tempString);
+//                    break;
+//            }
         }
     }
 
@@ -72,15 +75,38 @@ public class Controller {
 
     //region Array Management Methods
 
+
+    /**
+     * Core functionality of program.
+     */
+    private void RunCore() {
+        String userInputString = GetUserInput("Enter a name to search: ");
+
+        CreateArray();
+        PrintUnsortedArray();
+        SearchNameUnsorted(userInputString);
+
+        SortArray();
+        PrintSortedArray();
+        SearchNameSorted(userInputString);
+    }
+
+
     /**
      * Creates initial 2D array.
      * Values are filled in with random lowercase letters.
      */
     private void CreateArray() {
+        int arrayIndex1;
+        int arrayIndex2;
         int randomInt;
         char[] tempChar;
+//        Date startDate = new Date();
+//        Date endDate;
+//        long timeResult;
 
-        charArray = new char[arrayDim1][arrayDim2];
+        unsortedArray = new char[arrayDim1][arrayDim2];
+        sortedArray = new char[arrayDim1 * arrayDim2];
 
         // Populate array with random lowercase characters.
         for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) {
@@ -88,38 +114,37 @@ public class Controller {
                 randomInt = random.nextInt(26);
                 randomInt = randomInt + 97; // Set to valid ascii codes.
                 tempChar = Character.toChars((char) randomInt);
-                charArray[arrayIndex1][arrayIndex2] = tempChar[0];
+                unsortedArray[arrayIndex1][arrayIndex2] = tempChar[0];
             }
         }
+
+//        // Get time lapse of process.
+//        System.out.print("Array Creation Time: ");
+//        endDate = new Date();
+//        timeResult = computeTime.ComputeDateDifference(startDate, endDate);
+//        computeTime.PrintTime(timeResult);
     }
 
 
     /**
      * Sorts current array values alphabetically.
      */
-    private void Sort2DArray() {
+    private void SortArray() {
+        int arrayIndex1;
+        int arrayIndex2;
         int tempArrayIndex = 0;
-        char[] tempArray = new char[arrayDim1 * arrayDim2];
+        sortedArray = new char[arrayDim1 * arrayDim2];
 
         // Translate values into sortable 1d-Array.
         for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) {
             for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) {
-                tempArray[tempArrayIndex] = charArray[arrayIndex1][arrayIndex2];
+                sortedArray[tempArrayIndex] = unsortedArray[arrayIndex1][arrayIndex2];
                 tempArrayIndex++;
             }
         }
 
-        // Sort 1D-Array.
-        Arrays.sort(tempArray);
-
-        // Translate values back into 2d-Array
-        tempArrayIndex = 0;
-        for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) {
-            for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) {
-                charArray[arrayIndex1][arrayIndex2] = tempArray[tempArrayIndex];
-                tempArrayIndex++;
-            }
-        }
+        // Sort 1d-Array.
+        Arrays.sort(sortedArray);
     }
 
 
@@ -127,8 +152,8 @@ public class Controller {
      * Iterate through each char in name and search for value in array.
      * @param name Name to search through.
      */
-    private void SearchName(String name) {
-        int stringLength = name.length();;
+    private void SearchNameUnsorted(String name) {
+        int stringLength = name.length();
         int index = 0;
         char tempChar;
 
@@ -141,6 +166,26 @@ public class Controller {
     }
 
 
+    /**
+     * Iterate through each char in name and search for value in array.
+     * @param name Name to search through.
+     */
+    private void SearchNameSorted(String name) {
+        int stringLength = name.length();
+        int index = 0;
+        int returnIndex;
+        char tempChar;
+
+        while (index < stringLength) {
+            tempChar = name.charAt(index);
+            returnIndex = BinarySearch(tempChar, 0, ((arrayDim1 * arrayDim2) - 1));
+            index++;
+            // Send found values or -1 if not found.
+            PrintArraySearch(tempChar, returnIndex);
+        }
+    }
+
+
     /**
      * Linearly search through array for given value.
      * @param searchValue Char to search for.
@@ -148,15 +193,19 @@ public class Controller {
     private void LinearSearch(char searchValue) {
         int index1 = -1;
         int index2 = -1;
-        arrayIndex1 = 0;
+        int arrayIndex1 = 0;
+        int arrayIndex2;
 
         // Search through Array until value found or end of array.
         while (arrayIndex1 < arrayDim1) {
             arrayIndex2 = 0;
             while (arrayIndex2 < arrayDim2) {
-                if (charArray[arrayIndex1][arrayIndex2] == searchValue) {
+                if (unsortedArray[arrayIndex1][arrayIndex2] == searchValue) {
+
+                    // Save found values.
                     index1 = arrayIndex1;
                     index2 = arrayIndex2;
+                    // Set vars to exit loops.
                     arrayIndex1 = arrayDim1;
                     arrayIndex2 = arrayDim2;
                 }
@@ -169,8 +218,46 @@ public class Controller {
     }
 
 
-    private void BinarySearch() {
+    /**
+     * Binary search through array for given value.
+     * @param searchValue Char to search for
+     */
+    private int BinarySearch(char searchValue, int firstIndex, int lastIndex) {
+
+        // Check if first index is after last index.
+        if (firstIndex >= lastIndex) {
+            // End of search.
+            if (sortedArray[firstIndex] == searchValue) {
+                // Match found.
+                return firstIndex;
+            } else {
+                // No match found.
+                return -1;
+            }
+
+        } else {
+
+            // More potential values.
+            int middleIndex = (firstIndex + lastIndex) / 2;
+            if (sortedArray[middleIndex] == searchValue) {
+
+                // Match found.
+                return middleIndex;
 
+            } else {
+
+                // No match found.
+                if (sortedArray[middleIndex] > searchValue) {
+                    // Search value is earlier than current.
+                    // Searching first half of values.
+                    return BinarySearch(searchValue, firstIndex, middleIndex);
+                } else {
+                    // Search value is later than current.
+                    // Searching second half of values.
+                    return BinarySearch(searchValue, (middleIndex + 1), lastIndex);
+                }
+            }
+        }
     }
 
     //endregion Array Management Methods
@@ -216,29 +303,30 @@ public class Controller {
      * Sets dimensions of 2d-Array.
      */
     private void GetArrayDimensions() {
-        tempString = GetUserInput("Enter first array length: ");
+        String userInputString = GetUserInput("Enter first array length: ");
         try {
-            arrayDim1 = Integer.parseInt(tempString);
+            arrayDim1 = Integer.parseInt(userInputString);
         } catch (Exception e) {
             System.out.println("Invalid int value.");
         }
-        tempString = GetUserInput("Enter second array length: ");
+        userInputString = GetUserInput("Enter second array length: ");
         try {
-            arrayDim2 = Integer.parseInt(tempString);
+            arrayDim2 = Integer.parseInt(userInputString);
         } catch (Exception e) {
             System.out.println("Invalid int value.");
         }
-        System.out.println();
     }
 
 
     /**
-     * Prints current array values.
+     * Prints current unsorted array values.
      */
-    private void Print2DArray() {
+    private void PrintUnsortedArray() {
+        System.out.println("Unsorted Array:");
+
         for (int index1 = 0; index1 < arrayDim1; index1++) {
             for (int index2 = 0; index2 < arrayDim2; index2++) {
-                System.out.print(charArray[index1][index2] + " ") ;
+                System.out.print(unsortedArray[index1][index2] + " ");
             }
             System.out.println();
         }
@@ -246,11 +334,52 @@ public class Controller {
     }
 
 
+    /**
+     * Prints current sorted array values.
+     */
+    private void PrintSortedArray() {
+        System.out.println("Sorted Array:");
 
+        int index = 0;
+        for (int index1 = 0; index1 < arrayDim1; index1++) {
+            for (int index2 = 0; index2 < arrayDim2; index2++) {
+                System.out.print(sortedArray[index] + " ");
+                index++;
+            }
+            System.out.println();
+        }
+        System.out.println();
+    }
+
+
+    /**
+     * Print out search values for unsorted array.
+     * @param searchValue Char to search for.
+     * @param index1 Row char was found in.
+     * @param index2 Col char was found in.
+     */
     private void PrintArraySearch(char searchValue, int index1, int index2) {
         System.out.println(searchValue + ":[" + index1 + "," + index2 + "]");
     }
 
+
+    /**
+     * Print out search values for sorted array.
+     * @param searchValue Char to search for.
+     * @param index Index char was found in.
+     */
+    private void PrintArraySearch(char searchValue, int index) {
+        if (index > -1) {
+            // Item found.
+            int index1 = index / arrayDim1;
+            int index2 = index % arrayDim1;
+            System.out.println(searchValue + ":[" + index1 + "," + index2 + "]");
+        } else {
+            // Item not found.
+            System.out.println(searchValue + ":[" + index + "," + index + "]");
+        }
+    }
+
     //endregion User Interface Methods
 
     //endregion Methods
diff --git a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java b/a0/src/com/CS3310/a0/tests/ComputeTimeTests.java
similarity index 99%
rename from a0/src/com/CS3310/a0/tests/ComputeTimeTest.java
rename to a0/src/com/CS3310/a0/tests/ComputeTimeTests.java
index f3f18d55302d69a952018a6cb5876178da08264e..76bb9655af2f9054536e237c100caf606672e3de 100644
--- a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java
+++ b/a0/src/com/CS3310/a0/tests/ComputeTimeTests.java
@@ -8,7 +8,7 @@ import org.junit.Test;
 import com.CS3310.a0.ComputeTime;
 
 
-public class ComputeTimeTest {
+public class ComputeTimeTests {
 
     //region Variables