diff --git a/Makefile.build b/Makefile.build
index 30d709bed0682faf702cab87e8fe75b2e85cffd3..c079897805d7fb75ae1510b92d5e9af7dc59a224 100644
--- a/Makefile.build
+++ b/Makefile.build
@@ -63,7 +63,7 @@ userprog_SRC += userprog/syscall.c	# System call handler.
 userprog_SRC += userprog/gdt.c		# GDT initialization.
 userprog_SRC += userprog/tss.c		# TSS management.
 userprog_SRC += userprog/syscall_exec.c
-userprog_SRC += userprog/syscall_exit.c
+userprog_SRC += userprog/syscall_open.c
 userprog_SRC += userprog/syscall_halt.c
 userprog_SRC += userprog/syscall_wait.c
 userprog_SRC += userprog/syscall_create.c
diff --git a/userprog/syscall.c b/userprog/syscall.c
index c78175f256fa5a9e0b31bda1d2ae6fe2fb2bdd07..a494704341d8785dfd0ec0c772c4d9e3dbb38167 100644
--- a/userprog/syscall.c
+++ b/userprog/syscall.c
@@ -58,9 +58,6 @@ syscall_handler (struct intr_frame *f UNUSED)
   case SYSCALL_HALT:
     syscall_halt(f);
     break;
-  case SYSCALL_EXIT:
-    syscall_exit(f);
-    break;
   case SYSCALL_EXEC:
     syscall_exec(f);
     break;
@@ -70,6 +67,9 @@ syscall_handler (struct intr_frame *f UNUSED)
   case SYSCALL_CREATE:
     syscall_create(f);
     break;
+  case SYSCALL_OPEN:
+    syscall_open(f);
+	break;
   default:
     printf ("WARNING: Invalid Syscall (%d)\n", syscall_number);
     thread_exit ();
diff --git a/userprog/syscall_open.c b/userprog/syscall_open.c
new file mode 100644
index 0000000000000000000000000000000000000000..386fa269c9cdc95f7b4a27ac02c1d916c79c9afa
--- /dev/null
+++ b/userprog/syscall_open.c
@@ -0,0 +1,22 @@
+/*
+ * Opens the file called file. Returns a nonnegative integer handle called a 
+ * "file descriptor" (fd), or -1 if the file could not be opened.
+ *
+ * Authored by Alex Stratford
+ */
+
+
+#include "system_calls.h"
+#include "threads/interrupt.h" // Dependency for intr_frame struct
+#include "filesys/file.h" // Dependency for file_open and file struct
+
+void syscall_open(struct intr_frame *f) {
+	struct file_map *f_map; // Create f_map struct instance
+	// pop off first int argument from interrupt frame
+	f_map->file_descriptor = *((int*)f->esp + 1);
+	// Described in system_calls.h, opens the file
+	f_map->file = file_open(f_map->file_descriptor);
+	if (f_map->file == NULL) // Checking if file is empty or non-existent
+		f->eax = -1; // Returning a failure state
+	f->eax = f_map->file_descriptor; // Returning the file descriptor
+}
\ No newline at end of file
diff --git a/userprog/system_calls.h b/userprog/system_calls.h
index daed0eda12434a3bebc1b41db4999e293cb1ebed..b69bb44a4016b5408e4ce49197656085d47b6e28 100644
--- a/userprog/system_calls.h
+++ b/userprog/system_calls.h
@@ -1,4 +1,16 @@
 #include "threads/interrupt.h"
+#include "lib/kernel/list.h" // Added due to dependency for list_elem
+#include "filesys/file.h" // Added due to dependency for file
+
+
+// Maps file descriptions to the associated file structure
+struct file_map
+{
+	struct list_elem list_element; // Defined in list.h
+	int file_descriptor;
+	struct file *file; // Defined in file.c
+};
+
 
 /*
  * Terminates Pintos by calling shutdown_power_off()
@@ -6,14 +18,6 @@
  */
 void syscall_halt(struct intr_frame *f);
 
-/*
- * Terminates the current user program, returning status to the kernel. If the
- * process's parent waits for it (see below), this is the status that will be
- * returned. Conventionally, a status of 0 indicates success and nonzero
- * values indicate errors. 
- */
-void syscall_exit(struct intr_frame *status);
-
 /*
  * Runs the executable whose name is given in cmd_line, passing any given
  * arguments, and returns the new process's program id (pid). Must return pid
@@ -30,6 +34,7 @@ void syscall_exec(struct intr_frame *f);
 void syscall_wait(struct intr_frame *f);
 
 /*
+<<<<<<< HEAD
  * Creates a new file called file initially initial_size bytes in size.
  * Returns true if successful, false otherwise.
  */
@@ -39,3 +44,9 @@ void syscall_create(struct intr_frame *f);
  * NOTE: There are more system calls implemented by Pintos but we are not
  * implementing them because the assignment brief does not ask of it.
  */
+=======
+ * Opens the file called file. Returns a nonnegative integer handle called a
+ * "file descriptor" (fd), or -1 if the file could not be opened.
+ */
+void syscall_open(struct intr_frame *f);
+>>>>>>> Alex/27-implement-open-system-call