diff --git a/Makefile.build b/Makefile.build
index 06c26277e141eb0fe57b90c142ff71a6405e16b0..c54f871c82dabe39e188a5015efd728a413cc9cd 100644
--- a/Makefile.build
+++ b/Makefile.build
@@ -74,6 +74,8 @@ userprog_SRC += userprog/file_descriptors_map.c
 userprog_SRC += userprog/syscall_read.c
 userprog_SRC += userprog/syscall_filesize.c
 userprog_SRC += userprog/syscall_tell.c
+userprog_SRC += userprog/syscall_seek.c
+userprog_SRC += userprog/syscall_close.c
 
 # No virtual memory code yet.
 #vm_SRC = vm/file.c			# Some file.
diff --git a/userprog/syscall.c b/userprog/syscall.c
index b38eccabd22439f474267dc7ae12b07bcf7e4bd5..845508adf10abcae3b2da8702c162ead639ca67a 100644
--- a/userprog/syscall.c
+++ b/userprog/syscall.c
@@ -88,6 +88,12 @@ syscall_handler (struct intr_frame *f UNUSED)
   case SYSCALL_TELL:
     syscall_tell(f);
     break;
+  case SYSCALL_SEEK:
+	  syscall_seek(f);
+	  break;
+  case SYSCALL_CLOSE:
+    syscall_close(f);
+    break;
   default:
     printf ("WARNING: Invalid Syscall (%d)\n", syscall_number);
     thread_exit ();
diff --git a/userprog/syscall_close.c b/userprog/syscall_close.c
index 651173b53910e646cfe56c9417fe49a87d495939..8508962b192b2548c16d014234cc2c19b29f37aa 100644
--- a/userprog/syscall_close.c
+++ b/userprog/syscall_close.c
@@ -14,7 +14,7 @@
 
 void syscall_close(struct intr_frame *f) {
 	// pop off first int argument from interrupt frame
-	int* file_descriptor = (void*)(*(int*)f->esp + 1);
+	int file_descriptor = *((int*)f->esp + 1);
 	// Get file associated with file_descriptor
 	struct file *file = get_associated_file_pointer(file_descriptor);
 	if (file == NULL) { // Checking if file is empty or non-existent
@@ -25,4 +25,4 @@ void syscall_close(struct intr_frame *f) {
 	file_close(file);
 	// Remove the file_descriptor
 	disassociate_file_descriptor(file_descriptor);
-}
\ No newline at end of file
+}
diff --git a/userprog/syscall_seek.c b/userprog/syscall_seek.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a665a14a14c72a36a04c1fea7b5766130fdf09b
--- /dev/null
+++ b/userprog/syscall_seek.c
@@ -0,0 +1,22 @@
+/*
+* Changes the next byte to be read or written in open file fd to position, 
+* Expressed in bytes from the beginning of the file. (Thus, a position of 0
+* Is the file�s start.)
+*
+* Authored by Alex Stratford
+*/
+
+#include "system_calls.h"
+#include <stddef.h> // Dependency for NULL
+#include "threads/interrupt.h" // Dependency for intr_frame struct
+#include "filesys/file.h" // Dependency for file struct and file_seek function
+
+void syscall_seek(struct intr_frame *f) {
+	// pop off first int argument from interrupt frame
+	int file_descriptor = *((int*)f->esp + 1);
+	// pop off second int argument from interrupt frame
+	unsigned file_pos = *((unsigned*)((int*)f->esp + 2));
+	struct file *file = get_associated_file_pointer(file_descriptor);
+	// Seek through the file
+	file_seek(file, file_pos);
+}
diff --git a/userprog/system_calls.h b/userprog/system_calls.h
index ebeed4c37da16c0d0dfdec3ce5df30f25719bc5e..49b8145675f486ef12405293fa3d3678426006d5 100644
--- a/userprog/system_calls.h
+++ b/userprog/system_calls.h
@@ -75,6 +75,19 @@ void syscall_remove(struct intr_frame *f);
  */
 void syscall_tell(struct intr_frame *f);
 
+/*
+* Changes the next byte to be read or written in open file fd to position,
+* Expressed in bytes from the beginning of the file. (Thus, a position of 0
+* Is the file�s start.)
+*/
+void syscall_seek(struct intr_frame *f);
+
+/*
+ * Closes file descriptor fd. Exiting or terminating a process implicitly closes
+ * all its open file descriptors, as if by calling this function for each one.
+ */
+void syscall_close(struct intr_frame *f);
+
 /*
  * special additional stuff for handling file descriptors because they're annoying
  */