diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java
index 7eb81b34a1c8e0c845047514f151377197cd86cc..806d4bee9ad3e4f909819bf3d1a87053f755be23 100644
--- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java
+++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java
@@ -1,42 +1,58 @@
 package MV3500Cohort2024JulySeptember.homework2.Timberlake;
 
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
 import java.util.Scanner;
+import java.io.PrintWriter;
 
 /**
  *
  * @author Jack
  */
+
+
 public class Client_HW2 {
     public static void main(String[] args) {
-        DatagramSocket socket = null;
+        Socket socket = null;
         Scanner scanner = new Scanner(System.in);
         try {
             // Create a socket to communicate with the server
-            socket = new DatagramSocket();
-            InetAddress serverAddress = InetAddress.getByName("localhost"); // Server address (localhost for testing)
-            byte[] sendData = new byte[1024]; // Buffer to store data to send
-            byte[] receiveData = new byte[1024]; // Buffer to store received data
+            socket = new Socket("192.168.56.1", 9876);  // change IP depending on server machine
+
+            PrintWriter outputWriter = new PrintWriter(socket.getOutputStream(), true);
+            BufferedReader inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+
+            // Receive and display server messages
+            System.out.println(inputReader.readLine()); // Enter name
+            String name = scanner.nextLine();
+            outputWriter.println(name);  // Send name
+            outputWriter.flush();
 
-            System.out.print("Let's play a game!!\n");
-            System.out.print("Try guessing a number between 1-100\n");
+            System.out.println(inputReader.readLine()); // Enter fav color
+            String color = scanner.nextLine();
+            outputWriter.println(color);  // Send fav color
+            outputWriter.flush();
+            
+            // Receive and display initial messages from the server
+            // Empty string means init messages over
+            String serverMessage;
+            while (!(serverMessage = inputReader.readLine()).isEmpty()) {
+                System.out.println(serverMessage);
+            }            
+            
             while(true) {
                 System.out.print("Enter your guess: ");
                 String guess = scanner.nextLine(); //Read user input
-                sendData = guess.getBytes(); // Convert message to bytes
+                outputWriter.println(guess);       //Send guess to server
+                outputWriter.flush();
                 
-                // Send guess to the server
-                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9876);
-                socket.send(sendPacket); // Send packet to server
-
                 // Receive response from server
-                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
-                socket.receive(receivePacket); // Blocking call until a packet is received
-                String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
-                System.out.println("Server Said: " + response); // Print received response
+                String response = inputReader.readLine();
+                System.out.println("Server Said: " + response); // print server response
                 
+                // End game 
                 if (response.startsWith ("Good")) {
                     break; //End the game
                 }
@@ -49,7 +65,11 @@ public class Client_HW2 {
                 scanner.close(); // Close scanner 
             }
             if (socket != null && !socket.isClosed()) {
-                socket.close(); // Close the socket to release resources
+                try {
+                    socket.close(); // Close the socket to release resources
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
             }
         }
     } 
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..9403aa23e5602254321633278d8e3ceb1a6dca8f
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java
@@ -0,0 +1,102 @@
+package MV3500Cohort2024JulySeptember.homework2.Timberlake;
+
+/**
+ *
+ * @author Jack
+ */
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.util.Random;
+import java.util.HashMap;
+import java.util.Map;
+
+public class GameHandler implements Runnable {
+    private Socket clientSocket;
+    private int numToGuess;
+    private static final Map<String, String> userCredentials = new HashMap<>();
+    
+    static {
+        // User credentials dictionary 
+        userCredentials.put("Jack", "blue");
+        userCredentials.put("Stephen", "green");
+        userCredentials.put("Don", "red");
+
+    }
+    
+    public GameHandler(Socket clientSocket) {
+        this.clientSocket = clientSocket;
+        Random random = new Random();
+        this.numToGuess = random.nextInt(100) + 1; // Initialize random number 1-100
+    }
+
+    @Override
+    public void run() {
+        try (BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+             PrintWriter outputWriter = new PrintWriter(clientSocket.getOutputStream(), true)) {
+
+            // Request name from client 
+            outputWriter.println("Enter your name:");
+            outputWriter.flush();
+            String name = inputReader.readLine();
+            
+            // Request favorite color from client 
+            outputWriter.println("Enter your favorite color:");
+            outputWriter.flush();
+            String color = inputReader.readLine();
+
+            // Check credentials and start game 
+            // Kill connection if credentials are wrong
+            if (!(userCredentials.containsKey(name) && userCredentials.get(name).equalsIgnoreCase(color))) {
+                outputWriter.println("INTRUDER! INTRUDER! TERMINATING CONNECTION.");
+                clientSocket.close(); 
+            } else {
+                outputWriter.println("Authentication successful! Welcome, " + name + ".");
+                outputWriter.println("Let's play a game!!");
+                outputWriter.println("Try guessing a number between 1-100");
+                outputWriter.println(""); // Send an empty line to signal the end of initial messages
+            }
+            
+            int count = 1;
+            boolean isRunning = true;
+
+            while (isRunning) {
+                // Read message from client
+                String message = inputReader.readLine();
+                System.out.println("Client sent: " + message); // Print received message
+
+                String response;
+                try {
+                    int guess = Integer.parseInt(message.trim());
+                    if (guess < numToGuess) {
+                        response = "Guess Higher";
+                        count++;
+                    } else if (guess > numToGuess) {
+                        response = "Guess Lower";
+                        count++;
+                    } else {
+                        response = "Good Job " + name + "!! That took you " + count + " tries!";
+                        isRunning = false;
+                    }
+                } catch (NumberFormatException e) {
+                    response = "Invalid input. Enter a number.";
+                }
+
+                // Send response to client
+                outputWriter.println(response);
+            }
+        } catch (Exception e) {
+            e.printStackTrace(); // Print any exceptions that occur
+        } finally {
+            try {
+                if (clientSocket != null && !clientSocket.isClosed()) {
+                    clientSocket.close(); // Close the client socket to release resources
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java
index 3d9df86269f2a5b72d39e8845dc6522508f1d80c..987e79ec35af26cddb82cc8c5b53a889101993a3 100644
--- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java
+++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java
@@ -1,69 +1,44 @@
 package MV3500Cohort2024JulySeptember.homework2.Timberlake;
 
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.util.Random;
+import java.net.ServerSocket;
+import java.net.Socket;
 
 /**
  *
  * @author Jack
  */
+
+
 public class Server_HW2 {
     public static void main(String[] args) {
-        DatagramSocket socket = null;
-        Random random = new Random();
-        int numToGuess = random.nextInt(100) + 1;
-        //System.out.println("Magic Number Is: " + numToGuess);
+        ServerSocket serverSocket = null;
         
         try {
             // Create a socket to listen on port 9876
-            socket = new DatagramSocket(9876);
-            byte[] receiveData = new byte[1024]; // Buffer to store incoming data
-            byte[] sendData = new byte[1024]; // Buffer to store outgoing data
-            int count = 1;
+            serverSocket = new ServerSocket(9876);
             System.out.println("Server has started, waiting for client...");
+            
+            while (true) {
+                // Accept client connection
+                Socket clientSocket = serverSocket.accept();
+                System.out.println("Client connected");
 
-            boolean isRunning = true;
-            while (isRunning) {
-                // Receive packet from client
-                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
-                socket.receive(receivePacket); // Blocking call until a packet is received
-                
-                String message = new String(receivePacket.getData(), 0, receivePacket.getLength()); //Receive packet
-                InetAddress clientAddress = receivePacket.getAddress(); //Save IP for response
-                int clientPort = receivePacket.getPort();               //Save port for response
-                
-                System.out.println("Client sent: " + message); // Print received message
+                // Create GameHandler to handle client
+                GameHandler gameHandler = new GameHandler(clientSocket);
 
-                String response; 
-                try {
-                    int guess = Integer.parseInt(message.trim());
-                    if (guess < numToGuess) {
-                        response = "Guess Higher"; 
-                        count++;
-                    } else if (guess > numToGuess) {
-                        response = "Guess Lower"; 
-                        count++; 
-                    } else {
-                        response = "Good Job!! That took you " + count + " tries!";
-                        isRunning = false;
-                    }
-                } catch (NumberFormatException e) {
-                    response = "Invalid input. Enter a number.";
-                }
-                
-                // Prepare response to client
-                sendData = response.getBytes(); // Convert response message to bytes
-                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
-                socket.send(sendPacket); // Send response packet to client
-                
+                // Create new thread to handle the game
+                Thread thread = new Thread(gameHandler);
+                thread.start();
             }
         } catch (Exception e) {
             e.printStackTrace(); // Print any exceptions that occur
         } finally {
-            if (socket != null && !socket.isClosed()) {
-                socket.close(); // Close the socket to release resources
+            try {
+                if (serverSocket != null && !serverSocket.isClosed()) {
+                    serverSocket.close(); // Close the server socket to release resources
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
             }
         }
     }