diff --git a/a0/src/com/CS3310/a0/Controller.java b/a0/src/com/CS3310/a0/Controller.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b39e60bb82709190d8a89f3c326cd320cf19e2d
--- /dev/null
+++ b/a0/src/com/CS3310/a0/Controller.java
@@ -0,0 +1,163 @@
+package com.CS3310.a0;
+
+
+import java.util.Arrays;
+import java.util.Random;
+import java.util.Scanner;
+
+
+/**
+ * Handles main program functionality.
+ */
+public class Controller {
+
+    //region Variables
+    private int arrayIndex1;
+    private int arrayIndex2;
+    private int arrayDim1;
+    private int arrayDim2;
+    private String tempString;
+    private char[][] charArray;
+    private Random random = new Random();
+    private Scanner reader = new Scanner(System.in);
+
+    //endregion Variables
+
+
+
+    //region Constructor
+
+    /**
+     * Base constructor
+     */
+    public Controller() {
+        boolean runProgram = true;
+
+        while (arrayDim1 < 1 || arrayDim2 < 1) {
+            GetArrayDimensions();
+        }
+        CreateArray();
+
+        while (runProgram) {
+
+        }
+    }
+
+    //endregion Constructor
+
+
+
+    //region Methods
+
+    /**
+     * Creates initial 2D array.
+     * Values are filled in with random lowercase letters.
+     */
+    private void CreateArray() {
+        int randomInt;
+        char[] tempChar;
+
+        charArray = new char[arrayDim1][arrayDim2];
+
+        // Populate array with random lowercase characters.
+        for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) {
+            for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) {
+                randomInt = random.nextInt(26);
+                randomInt = randomInt + 97; // Set to valid ascii codes.
+                tempChar = Character.toChars((char) randomInt);
+                charArray[arrayIndex1][arrayIndex2] = tempChar[0];
+            }
+        }
+
+        Print2DArray();
+        System.out.println();
+        System.out.println("Sorting...");
+        System.out.println();
+        Sort2DArray();
+        Print2DArray();
+    }
+
+
+    /**
+     * Sets dimensions of 2d-Array.
+     */
+    private void GetArrayDimensions() {
+        tempString = GetUserInput("Enter first array length: ");
+        try {
+            arrayDim1 = Integer.parseInt(tempString);
+        } catch (Exception e) {
+            System.out.println("Invalid int value.");
+        }
+        tempString = GetUserInput("Enter second array length: ");
+        try {
+            arrayDim2 = Integer.parseInt(tempString);
+        } catch (Exception e) {
+            System.out.println("Invalid int value.");
+        }
+    }
+
+    /**
+     * Sorts current array values alphabetically.
+     */
+    private void Sort2DArray() {
+        int tempArrayIndex = 0;
+        char[] tempArray = 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];
+                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++;
+            }
+        }
+    }
+
+
+    /**
+     * Prints current array values.
+     */
+    private void Print2DArray() {
+        for (int index1 = 0; index1 < arrayDim1; index1++) {
+            for (int index2 = 0; index2 < arrayDim2; index2++) {
+                System.out.println(charArray[index1][index2]);
+            }
+        }
+    }
+
+
+    /**
+     * Prompt for and acquire user input.
+     * @param promptString String to show user.
+     * @return String of user's input.
+     */
+    private String GetUserInput(String promptString) {
+        System.out.println(promptString);
+        return reader.next().toLowerCase();
+    }
+
+
+    /**
+     * Print help text for user.
+     */
+    private void PrintHelp() {
+        System.out.println("To change array dimensions, type 'Dimensions'");
+        System.out.println("To sort current array, type 'sort'");
+        System.out.println("To show help again, type 'Help'");
+        System.out.println("To exit program, type 'Exit'");
+        System.out.println("Otherwise, type name to search in array");
+    }
+
+    //endregion Methods
+}
diff --git a/a0/src/com/CS3310/a0/Main.java b/a0/src/com/CS3310/a0/Main.java
index 3f88f4730217bb35c1254820aea2dc99cfebf36c..28d172cbeb7364e0cbfc9da62d0f2f1b5f558cc4 100644
--- a/a0/src/com/CS3310/a0/Main.java
+++ b/a0/src/com/CS3310/a0/Main.java
@@ -1,12 +1,13 @@
 package com.CS3310.a0;
 
 
-import java.util.Calendar;
-import java.util.Date;
-
-
+/**
+ * Main. Starts program.
+ */
 public class Main {
-    public static void main(String[] args) {
 
+    public static void main(String[] args) {
+        // Create class to run program from non-static source.
+        Controller controller = new Controller();
     }
 }
diff --git a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java b/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java
index 26e35cd0d48b3e592c915a69d514e1f14c5e33e4..f3f18d55302d69a952018a6cb5876178da08264e 100644
--- a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java
+++ b/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java
@@ -7,6 +7,7 @@ import org.junit.Test;
 
 import com.CS3310.a0.ComputeTime;
 
+
 public class ComputeTimeTest {
 
     //region Variables