diff --git a/Main.c b/Main.c
index cf1ad0a97fe228808503758a9c5581db7002de5f..4a358beef874c48984800911e88c432293bb47fb 100644
--- a/Main.c
+++ b/Main.c
@@ -54,7 +54,8 @@ void execute_command();     // Executes provided command.
 void recursive_execute();   // Continues executing command.
 void change_directory();    // Change current directory.
 char* get_directory_path(); // Gets full pathname of current directory.
-void redirect_fd();         // Redirects passed file descriptors.
+void get_umask();           // Gets current umask value.
+void set_umask();           // Sets umask value.
 void free_memory();         // Frees memory of vars.
 
 void make_arg_example();
@@ -110,10 +111,31 @@ int main(int argc, char* argv[]) {
                     }
                 }
 
+            // Check for pwd command.
             } else if (strcmp(**command_argv->argv, "pwd") == 0) {
-                current_directory = get_directory_path();
-                printf("%s\n", current_directory);
-                free(current_directory);
+                if (line_argv->argc > 1) {
+                    err_msg("Too many arguments.");
+                } else if (command_argv->argc > 1) {
+                    err_msg("Too many arguments.");
+                } else {
+                    current_directory = get_directory_path();
+                    printf("%s\n", current_directory);
+                    free(current_directory);
+                }
+
+            // Check for umask command.
+            } else if (strcmp(**command_argv->argv, "umask") == 0) {
+                if (line_argv->argc > 1) {
+                    err_msg("Too many arguments.");
+                } else {
+                    if (command_argv->argc > 2) {
+                        err_msg("Too many arguments.");
+                    } else if (command_argv->argc < 2) {
+                        get_umask();
+                    } else {
+                        set_umask(*(*command_argv->argv + 1));
+                    }
+                }
 
             // Attempt to exec command.
             } else {
@@ -315,6 +337,58 @@ char* get_directory_path() {
 }
 
 
+/**
+ * Gets current umask value.
+ */
+void get_umask() {
+    mode_t old_val = umask(0);
+    umask(old_val);
+    printf("Umask Value: %d\n", old_val);
+}
+
+
+/**
+ * Sets current umask value.
+ */
+void set_umask(char* string_val) {
+    int valid_input = 1;
+
+    // Validate input.
+    if (strlen(string_val) > 0) {
+        if ((string_val[0] - '0') > 7) {
+            valid_input = 0;
+        }
+    }
+    if (strlen(string_val) > 1) {
+        if ((string_val[1] - '0') > 7) {
+            valid_input = 0;
+        }
+    }
+    if (strlen(string_val) > 2) {
+        if ((string_val[2] - '0') > 7) {
+            valid_input = 0;
+        }
+    }
+    if (strlen(string_val) > 3) {
+        if ((string_val[3] - '0') > 7) {
+            valid_input = 0;
+        }
+    }
+    if (strlen(string_val) > 4) {
+        valid_input = 0;
+    }
+
+    if (valid_input == 1) {
+        // Passed validation. Changing mask value.
+        int new_val = atoi(string_val);
+        mode_t old_val = umask(new_val);
+        printf("Umask Value: %d   Prev Value: %d\n", new_val, old_val);
+    } else {
+        printf("Invalid umask value.\n");
+    }
+}
+
+
 /**
  * Frees memory of main program variables.
  */