diff --git a/README.md b/README.md
index b82802ae34f59d282a83088cb224ab9d685bd978..f6cf8d65bd192d1e65ce26ce47fc27bb4202f22b 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
 # Assignment 4 - Interfaces, Stacks, Queues, Generics, and Merge Sort. Project uses Assignment 3 solution.
-## Due: 11-10-2015
 
 ## Author
 
-
+Brandon Rodriguez
 
 ## Description
 
@@ -67,11 +66,12 @@ Be sure to think about what the time complexity for the bucket sort will be. Thi
 
 ## Outside Resources Used
 
-
+https://msdn.microsoft.com/en-us/library/y2ky8xsk%28v=vs.110%29.aspx
+* Figured out exactly how the base CompareTo method works.
 
 ## Known Problems, Issues, And/Or Errors in the Program
 
-
+Appears to be functioning corerctly? ...maybe?
 
 ## Assignment 3 Description for reference
 
diff --git a/cis237assignment4/Droid.cs b/cis237assignment4/Droid.cs
index 0e16ea79cdd820f86e308e530753455aab09695a..eb749ef221b8234cf0f284eadcb42b36a811b632 100644
--- a/cis237assignment4/Droid.cs
+++ b/cis237assignment4/Droid.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Abstract class for Droids. Handles "higher level" thinking/rules.
@@ -20,7 +20,7 @@ namespace cis237assignment3
         protected decimal totalCostDecimal;                 // Full cost of droid, including all extra features.
         protected decimal costPerFeatureDecimal = 10;       // Standard cost per most features.
         protected int numberOfItemsInt;                     // Number of individual items influencing droid price.
-
+        public string droidTypeString;
 
         // All the necessary variables for material selection.
         protected string selectedMaterialString;
@@ -155,9 +155,9 @@ namespace cis237assignment3
         /// </summary>
         public virtual void CalculateFeatures()
         {
-            selectedModelDecimal = 10;
-            selectedMaterialDecimal = 10;
-            selectedColorDecimal = 10;
+            selectedModelDecimal = costPerFeatureDecimal * 10;
+            selectedMaterialDecimal = costPerFeatureDecimal * 5;
+            selectedColorDecimal = costPerFeatureDecimal * 1;
 
             CalculateBaseCost();
         }
@@ -182,7 +182,22 @@ namespace cis237assignment3
                 Environment.NewLine;
         }
 
+        /// <summary>
+        /// Impliments CompareTo with droids, using the totalCost property.
+        /// </summary>
+        /// <param name="obj">Object to compare.</param>
+        /// <returns>Returns less than 0, 0, or greater than 0.</returns>
+        public int CompareTo(object obj)
+        {
+            Droid passedDroid = (Droid)obj;
+            decimal thisTotalCost = this.totalCostDecimal;
+            decimal passedTotalCost = passedDroid.totalCostDecimal;
+            return thisTotalCost.CompareTo(passedTotalCost);
+        }
+
         #endregion
 
+
+        
     }
 }
diff --git a/cis237assignment4/DroidCollection.cs b/cis237assignment4/DroidCollection.cs
index 205cc8aef5cbc21c47888a3fc2b9cf5c5b42b6ce..aeba207894fb19c85a921efa5dc99f520b384e9a 100644
--- a/cis237assignment4/DroidCollection.cs
+++ b/cis237assignment4/DroidCollection.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     class DroidCollection
     {
@@ -80,8 +80,8 @@ namespace cis237assignment3
                     tempArray[indexInt] = droidCollection[indexInt];
                     indexInt++;
                 }
-                droidCollection = tempArray;
             }
+            droidCollection = tempArray;
         }
 
         #endregion
@@ -118,6 +118,94 @@ namespace cis237assignment3
             }
         }
 
+        /// <summary>
+        /// Attempt at bucket sort.
+        /// </summary>
+        public void SortBucket()
+        {
+            GenericLinkedList<IDroid> Protocol_Stack = new GenericLinkedList<IDroid>();
+            GenericLinkedList<IDroid> Utility_Stack = new GenericLinkedList<IDroid>();
+            GenericLinkedList<IDroid> Janitor_Stack = new GenericLinkedList<IDroid>();
+            GenericLinkedList<IDroid> Astromech_Stack = new GenericLinkedList<IDroid>();
+
+            GenericLinkedList<IDroid> Droid_Queue = new GenericLinkedList<IDroid>();
+
+            indexInt = 0;
+            while (indexInt < droidListSizeInt)
+            {
+                switch (((Droid)droidCollection[indexInt]).droidTypeString)
+                {
+                    case "Protocol":
+                        Protocol_Stack.Add(droidCollection[indexInt]);
+                        break;
+                    case "Utility":
+                        Utility_Stack.Add(droidCollection[indexInt]);
+                        break;
+                    case "Janitor":
+                        Janitor_Stack.Add(droidCollection[indexInt]);
+                        break;
+                    case "Astromech":
+                        Astromech_Stack.Add(droidCollection[indexInt]);
+                        break;
+                }
+                indexInt++;
+            }
+
+            // Technically not needed, but added to be able to see that the list is empty before being popped off the queue. For debugging purposes. Remove in final version.
+            indexInt = 0;
+            while (indexInt < droidListSizeInt)
+            {
+                droidCollection[indexInt] = null;
+                indexInt++;
+            }
+
+
+            // Take droids off stacks.
+            while (Astromech_Stack.HeadNode != null)
+            {
+                Droid_Queue.Add(Astromech_Stack.HeadNode.Data);
+                Astromech_Stack.Delete(1);
+            }
+
+            while (Janitor_Stack.HeadNode != null)
+            {
+                Droid_Queue.Add(Janitor_Stack.HeadNode.Data);
+                Janitor_Stack.Delete(1);
+            }
+
+            while (Utility_Stack.HeadNode != null)
+            {
+                Droid_Queue.Add(Utility_Stack.HeadNode.Data);
+                Utility_Stack.Delete(1);
+            }
+
+            while (Protocol_Stack.HeadNode != null)
+            {
+                Droid_Queue.Add(Protocol_Stack.HeadNode.Data);
+                Protocol_Stack.Delete(1);
+            }
+
+            
+            // Pop off queue and back into array.
+            // Probably currently works as a stack. Likely in reversed order right now. Fix later.
+            indexInt = 0;
+            while (Droid_Queue.HeadNode != null) 
+            {
+                droidCollection[indexInt] = Droid_Queue.HeadNode.Data;
+                Droid_Queue.Delete(1);
+                indexInt++;
+            }
+
+        }
+
+        /// <summary>
+        /// Attempt at merged sort.
+        /// </summary>
+        public void SortMergedSort()
+        {
+            MergedSort.Sort(droidCollection, droidListSizeInt);
+        }
+
         #endregion
 
     }
diff --git a/cis237assignment4/Droid_Astromech.cs b/cis237assignment4/Droid_Astromech.cs
index a2151289dedf17d92a5cfc14ab8324e14f6e5ccb..37c706d9a50c1d8d852dab9041b5f6cea481b09f 100644
--- a/cis237assignment4/Droid_Astromech.cs
+++ b/cis237assignment4/Droid_Astromech.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Class for Droids of type Astromech.
@@ -53,6 +53,7 @@ namespace cis237assignment3
             HasFireExtinguisher = hasFireExtinguisher;
             NumberOfShips = numberOfShips;
             numberOfItemsInt = 8;
+            droidTypeString = "Astromech";
         }
 
         #endregion
diff --git a/cis237assignment4/Droid_Janitor.cs b/cis237assignment4/Droid_Janitor.cs
index 15f4fd8f97548db7b7184042cbe6644c9e5a0dd0..178f9e17a68f6c5a472d3cd35423868c8e88bbd9 100644
--- a/cis237assignment4/Droid_Janitor.cs
+++ b/cis237assignment4/Droid_Janitor.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Class for Droids of type Janitor.
@@ -53,6 +53,7 @@ namespace cis237assignment3
             HasTrashCompactor = hasTrashCompactor;
             HasVacuum = hasVacuum;
             numberOfItemsInt = 8;
+            droidTypeString = "Janitor";
         }
 
         #endregion
diff --git a/cis237assignment4/Droid_Protocol.cs b/cis237assignment4/Droid_Protocol.cs
index f492d49905ff994ac54728e0d3e385e71d438bd2..7f9c8f0da45eef1e3f8bc6fc25510c01b5661f5e 100644
--- a/cis237assignment4/Droid_Protocol.cs
+++ b/cis237assignment4/Droid_Protocol.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Class for Droids of type Protocol.
@@ -52,6 +52,7 @@ namespace cis237assignment3
         {
             NumberOfLanguages = numberOfLanguages;
             numberOfItemsInt = 4;
+            droidTypeString = "Protocol";
         }
 
         #endregion
diff --git a/cis237assignment4/Droid_Utility.cs b/cis237assignment4/Droid_Utility.cs
index a76a9fbca178ce65037515c82943c33fc7ef1891..75aaead54c6b4c74fb2f7410fd63f9ff2476cdf4 100644
--- a/cis237assignment4/Droid_Utility.cs
+++ b/cis237assignment4/Droid_Utility.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Class for Droids of type Utility.
@@ -54,6 +54,7 @@ namespace cis237assignment3
             HasComputerConnection = hasComputerConnection;
             HasArm = hasArm;
             numberOfItemsInt = 6;
+            droidTypeString = "Utility";
         }
 
         #endregion
diff --git a/cis237assignment4/GenericLinkedList.cs b/cis237assignment4/GenericLinkedList.cs
new file mode 100644
index 0000000000000000000000000000000000000000..aeb130d2f5fecc73e8e713d61ac0220c1fdb5463
--- /dev/null
+++ b/cis237assignment4/GenericLinkedList.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cis237assignment4
+{
+    /// <summary>
+    /// Code coppied over from inclass. Too tired to be able to figure out how it works. Seems to function correctly?
+    /// I think it currently functions as a stack....maybe. O..or is it a queue? Confused. Can't decipher code.
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    class GenericLinkedList<T>
+    {
+
+        #region Variables
+
+        //private GenericNode<T> headNode;        // First position in list. ...not needed? Not sure where we establish head node without this variable.
+        private GenericNode<T> currentNode;     // Current position in list.
+        private GenericNode<T> lastNode;        // Last position in list?
+
+        #endregion
+
+
+        #region Constructor
+
+        public GenericLinkedList()
+        {
+            HeadNode = null;
+        }
+
+        #endregion
+
+
+        #region Properties
+
+        public GenericNode<T> HeadNode
+        {
+            set;
+            get;
+        }
+
+        #endregion
+
+
+        #region Methods
+
+        public void Add(T content)
+        {
+            GenericNode<T> node = new GenericNode<T>();
+
+            node.Data = content;
+
+            if (HeadNode == null)
+            {
+                HeadNode = node;
+            }
+            else
+            {
+                lastNode.Next = node;
+            }
+            lastNode = node;
+        }
+
+        public bool Delete(int Position)
+        {
+            currentNode = HeadNode;
+            if (Position == 1)
+            {
+                HeadNode = currentNode.Next;
+                currentNode.Next = null;
+                currentNode = null;
+                return true;
+            }
+            else
+            {
+                if (Position > 1)
+                {
+                    GenericNode<T> tempNode = HeadNode;
+                    GenericNode<T> previousTempNode = null;
+
+                    int count = 0;
+                    while (tempNode != null)
+                    {
+                        if (count == Position - 1)
+                        {
+                            previousTempNode.Next = tempNode.Next;
+
+                            if (tempNode.Next == null)
+                            {
+                                lastNode = previousTempNode;
+                            }
+
+                            tempNode.Next = null;
+                            return true;
+                        }
+                        count++;
+                        previousTempNode = tempNode;
+                        tempNode = tempNode.Next;
+                    }
+                }
+            }
+            return false;
+        }
+
+        public GenericNode<T> Retrieve(int Position)
+        {
+            GenericNode<T> tempNode = HeadNode;
+            GenericNode<T> returnNode = null;
+
+            int count = 0;
+            while (tempNode != null)
+            {
+                if (count == Position - 1)
+                {
+                    return tempNode;
+                    break;  // ...why is there a break after a return? Doesn't make sense.
+                }
+                count++;
+                tempNode = tempNode.Next;
+            }
+            return returnNode;
+        }
+
+        #endregion
+    }
+}
diff --git a/cis237assignment4/GenericNode.cs b/cis237assignment4/GenericNode.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b8a5d5981eda6e4d0fe7d1b7aef308da1de9365f
--- /dev/null
+++ b/cis237assignment4/GenericNode.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cis237assignment4
+{
+    class GenericNode<T>
+    {
+        public GenericNode<T> Next
+        {
+            set;
+            get;
+        }
+
+        public T Data
+        {
+            set;
+            get;
+        }
+    }
+}
diff --git a/cis237assignment4/IDroid.cs b/cis237assignment4/IDroid.cs
index 8e2783adc934ede9acaca099cbd1c6e3016fc3b6..4963f98f2143f4af0a502390c22e2f0fac319d0d 100644
--- a/cis237assignment4/IDroid.cs
+++ b/cis237assignment4/IDroid.cs
@@ -6,13 +6,13 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Interface for all droid objects.
     /// Acts as a "universal blueprint/contract" of sorts.
     /// </summary>
-    interface IDroid
+    interface IDroid : IComparable
     {
         /// <summary>
         /// Calculates total cost of droid.
diff --git a/cis237assignment4/MergedSort.cs b/cis237assignment4/MergedSort.cs
new file mode 100644
index 0000000000000000000000000000000000000000..68b3f403c9309c146e71c3a409228c754becab27
--- /dev/null
+++ b/cis237assignment4/MergedSort.cs
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cis237assignment4
+{
+    class MergedSort
+    {
+        private static IDroid[] tempArray;
+
+        /// <summary>
+        /// Creates the temp array and starts the recursive mergeSorting.
+        /// </summary>
+        /// <param name="droidCollection">Collection of Droids to sort.</param>
+        /// <param name="sizeInt">Total size of collection.</param>
+        public static void Sort(IDroid[] droidCollection, int sizeInt)
+        {
+            tempArray = new IDroid[sizeInt];
+            SortArray(droidCollection, 0, sizeInt - 1);
+        }
+
+        /// <summary>
+        /// First half of recursion.
+        /// "Sorts" the array by dividing it up into smaller and smaller sections.
+        /// </summary>
+        /// <param name="droidCollection">Passed in collection of Droids to sort.</param>
+        /// <param name="lowInt">Current low int of section.</param>
+        /// <param name="highInt">Current high int of section.</param>
+        private static void SortArray(IDroid[] droidCollection, int lowInt, int highInt)
+        {
+            // If higher is less or equal to lower, then back out of recursion to stop sorting (that specific section).
+            if (highInt <= lowInt)
+            {
+                return;
+            }
+
+            int midInt = lowInt + (highInt - lowInt) / 2;           // Determine middle int. Not sure why it uses an average plus low?
+            SortArray(droidCollection, lowInt, midInt);             // Sort left half.
+            SortArray(droidCollection, midInt + 1, highInt);        // Sort right half.
+            MergeArray(droidCollection, lowInt, midInt, highInt);   // Combined separated sections.
+
+        }
+
+        /// <summary>
+        /// Merges the separated sections back into a fully sorted array.
+        /// </summary>
+        /// <param name="droidCollection">Passed in collection of Droids to sort.</param>
+        /// <param name="lowInt">Current low int of section.</param>
+        /// <param name="midInt">Current middle int of section.</param>
+        /// <param name="hightInt">Current high int of section.</param>
+        private static void MergeArray(IDroid[] droidCollection, int lowInt, int midInt, int hightInt)
+        {
+            int leftHolder = lowInt;
+            int rightHolder = midInt + 1;
+
+            for (int index = lowInt; index <= hightInt; index++)
+            {
+                if (droidCollection[index] != null)
+                {
+                    tempArray[index] = droidCollection[index];
+                }
+            }
+
+            for (int index = lowInt; index <= hightInt; index++)
+            {
+                // If left side is done but right is not.
+                if (leftHolder > midInt)
+                {
+                    droidCollection[index] = tempArray[rightHolder++];
+                }
+                else
+                {
+                    // If right side is done but left is not.
+                    if (rightHolder > hightInt)
+                    {
+                        droidCollection[index] = tempArray[leftHolder++];
+                    }
+                    // Else actually compare the current left holder and right holder values.
+                    else
+                    {
+                        if (tempArray[rightHolder].CompareTo(tempArray[leftHolder]) <= 0)
+                        {
+                            droidCollection[index] = tempArray[rightHolder++];
+                        }
+                        else
+                        {
+                            droidCollection[index] = tempArray[leftHolder++];
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/cis237assignment4/Program.cs b/cis237assignment4/Program.cs
index 6e1ec0a6c5ad2dcd3ae70c8842e4e4a2df074c7b..6fd3bbd5e036a70f9f132c69b9d5fe141c3cb0d6 100644
--- a/cis237assignment4/Program.cs
+++ b/cis237assignment4/Program.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     class Program
     {
diff --git a/cis237assignment4/RunProgram.cs b/cis237assignment4/RunProgram.cs
index 05d8fbd283682759ae8a83910339d59d37c71726..4717c54e516da2e56e7e953e38d711b6d7579689 100644
--- a/cis237assignment4/RunProgram.cs
+++ b/cis237assignment4/RunProgram.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Handles main operations of program.
@@ -71,6 +71,7 @@ namespace cis237assignment3
         private void Run()
         {
             ResetList();
+            AddTestingDroids();
             while (runProgram)
             {
                 // Resets/initializes menu bool to allow user to stay in menus.
@@ -82,6 +83,92 @@ namespace cis237assignment3
             }
         }
 
+        /// <summary>
+        /// Force create a bunch of droids on start for testing. Purposely in random order, both in DROID_TYPE and cost.
+        /// </summary>
+        private void AddTestingDroids()
+        {
+            droidCollection.AddDroid(new Droid_Astromech("Tin", "TI-84", "White", true, false, true, false, 1));
+            droidCollection.DroidList[0].CalculateFeatures();
+            droidCollection.DroidList[0].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Astromech("Steel", "CAT5", "Black", false, true, false, true, 3));
+            droidCollection.DroidList[1].CalculateFeatures();
+            droidCollection.DroidList[1].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Protocol("Tin", "TI-84", "White", 1));
+            droidCollection.DroidList[2].CalculateFeatures();
+            droidCollection.DroidList[2].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Protocol("Steel", "CAT5", "Black", 3));
+            droidCollection.DroidList[3].CalculateFeatures();
+            droidCollection.DroidList[3].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Protocol("Titanium", "M7", "Blue", 7));
+            droidCollection.DroidList[4].CalculateFeatures();
+            droidCollection.DroidList[4].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Janitor("Tin", "TI-84", "White", true, false, true, false, true));
+            droidCollection.DroidList[5].CalculateFeatures();
+            droidCollection.DroidList[5].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Janitor("Steel", "CAT5", "Black", false, true, false, true, false));
+            droidCollection.DroidList[6].CalculateFeatures();
+            droidCollection.DroidList[6].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Utility("Unobtanium", "M7", "Green", true, false, true));
+            droidCollection.DroidList[7].CalculateFeatures();
+            droidCollection.DroidList[7].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Janitor("Titanium", "M7", "Blue", true, true, true, true, true));
+            droidCollection.DroidList[8].CalculateFeatures();
+            droidCollection.DroidList[8].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Protocol("Mythril", "TI-84", "Red", 15));
+            droidCollection.DroidList[9].CalculateFeatures();
+            droidCollection.DroidList[9].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Protocol("Unobtanium", "M7", "Green", 1));
+            droidCollection.DroidList[10].CalculateFeatures();
+            droidCollection.DroidList[10].CalculateTotalCost();
+            
+            droidCollection.AddDroid(new Droid_Utility("Tin", "TI-84", "White", true, false, true));
+            droidCollection.DroidList[11].CalculateFeatures();
+            droidCollection.DroidList[11].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Utility("Steel", "CAT5", "Black", false, true, false));
+            droidCollection.DroidList[12].CalculateFeatures();
+            droidCollection.DroidList[12].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Astromech("Mythril", "TI-84", "Red", false, false, false, false, 7));
+            droidCollection.DroidList[13].CalculateFeatures();
+            droidCollection.DroidList[13].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Astromech("Unobtanium", "M7", "Green", true, false, true, false, 9));
+            droidCollection.DroidList[14].CalculateFeatures();
+            droidCollection.DroidList[14].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Utility("Titanium", "M7", "Blue", true, true, true));
+            droidCollection.DroidList[15].CalculateFeatures();
+            droidCollection.DroidList[15].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Utility("Mythril", "TI-84", "Red", false, false, false));
+            droidCollection.DroidList[16].CalculateFeatures();
+            droidCollection.DroidList[16].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Janitor("Mythril", "TI-84", "Red", false, false, false, false, false));
+            droidCollection.DroidList[17].CalculateFeatures();
+            droidCollection.DroidList[17].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Janitor("Unobtanium", "M7", "Green", true, false, true, false, true));
+            droidCollection.DroidList[18].CalculateFeatures();
+            droidCollection.DroidList[18].CalculateTotalCost();
+
+            droidCollection.AddDroid(new Droid_Astromech("Titanium", "M7", "Blue", true, true, true, true, 5));
+            droidCollection.DroidList[19].CalculateFeatures();
+            droidCollection.DroidList[19].CalculateTotalCost();
+        }
+
         /// <summary>
         /// Handles Main Menu Selection.
         /// </summary>
@@ -102,6 +189,9 @@ namespace cis237assignment3
                     ResetList();
                     break;
                 case "5":
+                    SortList();
+                    break;
+                case "6":
                     Exit();
                     break;
                 case "esc":
@@ -113,6 +203,23 @@ namespace cis237assignment3
             }
         }
 
+        private void SortList()
+        {
+            UserInterface.Menus.DisplaySorting();
+            userInputString = UserInterface.GetUserInput();
+            switch (userInputString)
+            {
+                case "1":
+                    droidCollection.SortBucket();
+                    break;
+                case "2":
+                    droidCollection.SortMergedSort();
+                    break;
+                case "esc":
+                    break;
+            }
+        }
+
         /// <summary>
         /// User selection to add a new droid to list.
         /// </summary>
diff --git a/cis237assignment4/UserInterface.cs b/cis237assignment4/UserInterface.cs
index fa4c614d7421c8cb0651e465db6ca77a92a3596c..1648c5295cb66c6d6b8642eccf4584a056d9f5f0 100644
--- a/cis237assignment4/UserInterface.cs
+++ b/cis237assignment4/UserInterface.cs
@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace cis237assignment3
+namespace cis237assignment4
 {
     /// <summary>
     /// Handles all display to user and reading of user input.
@@ -158,7 +158,19 @@ namespace cis237assignment3
                     "   2) Display Full Reciept" + Environment.NewLine +
                     "   3) Display Single Item" + Environment.NewLine +
                     "   4) New Customer" + Environment.NewLine +
-                    "   5) Exit");
+                    "   5) Sort Stuff" + Environment.NewLine +
+                    "   6) Exit");
+            }
+
+            public static void DisplaySorting()
+            {
+                ResetMenuDisplay();
+
+                Console.WriteLine(
+                    "  Sorting type:" + Environment.NewLine +
+                    "  1) Sort by Type (Bucket Sort)" +
+                    "  2) Sort by Cost (Merged Sort)"
+                    );
             }
 
             /// <summary>
diff --git a/cis237assignment4/cis237assignment4.csproj b/cis237assignment4/cis237assignment4.csproj
index 99c404d8f0f7badd1a683905822c70fb15a0bd6c..b2ff7df90c71627b62b36fa5cc8ad6125ff5b812 100644
--- a/cis237assignment4/cis237assignment4.csproj
+++ b/cis237assignment4/cis237assignment4.csproj
@@ -47,7 +47,10 @@
     <Compile Include="Droid_Janitor.cs" />
     <Compile Include="Droid_Protocol.cs" />
     <Compile Include="Droid_Utility.cs" />
+    <Compile Include="GenericLinkedList.cs" />
+    <Compile Include="GenericNode.cs" />
     <Compile Include="IDroid.cs" />
+    <Compile Include="MergedSort.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RunProgram.cs" />