diff --git a/Main.c b/Main.c
index 889467b456a7fd6094fdf04b1478e1de212d8095..53de1e4e56bbce831adb1b9a48c20fbb1759215d 100644
--- a/Main.c
+++ b/Main.c
@@ -19,6 +19,7 @@
 
 
 // Import headers.
+#include <arpa/inet.h>
 #include <ctype.h>
 #include <netdb.h>
 #include <pthread.h>
@@ -38,16 +39,24 @@
 
 
 // Variables.
-// pthread_cond_t thread_finished;
+struct conn_obj {
+    int* index;
+    int conn_fd;
+    struct sockaddr_in* client_address;
+};
+
 int threads_finished;
 int thread_free[THREAD_MAX];
 int thread_joinable[THREAD_MAX];
+struct sockaddr_in server_address;
+unsigned short port_number;
 pthread_t* thread_array;
 
 
 // Method Declaration.
 void* serve_request();  // Handles processing of a request from a new thread.
 void join_threads();    // Attempts to join all finished child threads.
+void send_response();   // Generates and sends http response to requesting client.
 
 
 /**
@@ -60,9 +69,8 @@ int main(int argc, char* argv[]) {
     int listen_fd;
     int con_fd;
     int thread_created;
-    unsigned short port_number;
     char* media_path;
-    struct sockaddr_in server_address;
+    struct sockaddr_in* client_address;
     socklen_t address_len;
     pthread_attr_t attr;
     size_t stacksize;
@@ -88,7 +96,7 @@ int main(int argc, char* argv[]) {
     } else {
         strcat(media_path, "/Media");
     }
-    printf("Media Path: %s\n", media_path);
+    printf("Media Path: %s\n\n", media_path);
 
     // Creates socket and sets listener file descriptor.
     if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
@@ -133,13 +141,14 @@ int main(int argc, char* argv[]) {
         thread_joinable[index] = 0;
     }
 
-    printf("Threading established. Awaiting connection...\n");
+    printf("Threading established. Awaiting connection...\n\n");
 
     // Run indefinitely, accepting new connections and creating new threads for each.
     while (1) {
 
         // Check for successful connection.
-        if ((con_fd = accept(listen_fd, (struct sockaddr*) &server_address, (socklen_t*) &address_len)) >= 0) {
+        client_address = calloc(1, sizeof(struct sockaddr));
+        if ((con_fd = accept(listen_fd, (struct sockaddr*) client_address, (socklen_t*) &address_len)) >= 0) {
             printf("Recieving request...\n");
 
             // Loop until new thread is created.
@@ -173,7 +182,10 @@ int main(int argc, char* argv[]) {
             }
 
             // A connection has been established. Open new thread.
-            pthread_create(&thread_array[0], &attr, serve_request, (void*) copy_int(&index));
+            char* ip = inet_ntoa(client_address->sin_addr);
+            printf("Client IP: %s\n", ip);
+            // pthread_create(&thread_array[0], &attr, serve_request, (void*) copy_int(&index));
+            pthread_create(&thread_array[0], &attr, serve_request, (void*) &((struct conn_obj) {copy_int(&index), -1, client_address}));
         }
 
         // Check if any threads have finished. If so, join.
@@ -187,14 +199,16 @@ int main(int argc, char* argv[]) {
 /**
  * Handles processing of a request from a new thread.
  */
-void* serve_request(int* index) {
-    printf("\nRequest recieved and thread #%d created!\n", *index);
-    printf("Not doing anything about it though. Terminating thread.\n\n");
+void* serve_request(struct conn_obj* connection) {
+    printf("\nRequest recieved and thread #%d created!\n", *connection->index);
+    send_response(connection);
+    printf("Terminating thread.\n\n");
 
     // Set values so that main can figure out what child threads are done executing.
     threads_finished = 1;
-    thread_joinable[*index] = 1;
-    free(index);
+    thread_joinable[*connection->index] = 1;
+    free(connection->index);
+    free(connection->client_address);
 
     // Exit thread.
     pthread_exit((void*) NULL);
@@ -219,3 +233,27 @@ void join_threads() {
     }
     threads_finished = 0;
 }
+
+
+/**
+ * Generates and sends http response to requesting client.
+ */
+void send_response(struct conn_obj connection) {
+    char* temp_string;
+    char* response_buffer = calloc(BUFFER_SIZE, sizeof(char*));
+
+    strcat(response_buffer, "HTTP/1.2 200 OK\r\n");
+
+    strcat(response_buffer, "Host: ");
+    temp_string = inet_ntoa(server_address.sin_addr);
+    strcat(response_buffer, temp_string);
+    strcat(response_buffer, ":");
+    temp_string = calloc(10, sizeof(char*));
+    sprintf(temp_string, "%u", port_number);
+    strcat(response_buffer, temp_string);
+    strcat(response_buffer, "\r\n");
+    strcat(response_buffer, "Content-Type: text/html\r\n");
+    strcat(response_buffer, "\r\n");
+
+    printf("%s\n", response_buffer);
+}