diff --git a/src/commands.c b/src/commands.c
index 20293c896ca4d203a2461c69f88ac24c0a4bca07..3748285057305e22bee2bea5eb2474077fefc1d8 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1,12 +1,20 @@
+#include <stdio.h>
 #include <string.h>
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <linux/limits.h>
+
 #include "commands.h"
 
 int do_cd(int argc, char** argv) {
   if (!validate_cd_argv(argc, argv))
     return -1;
 
-  // TODO: Fill it!
+  if (chdir(argv[1]) == -1)
+    return -1;
+
   return 0;
 }
 
@@ -14,17 +22,31 @@ int do_pwd(int argc, char** argv) {
   if (!validate_pwd_argv(argc, argv))
     return -1;
 
-  // TODO: Fill it!
+  char curdir[PATH_MAX];
+
+  if (getcwd(curdir, PATH_MAX) == NULL)
+    return -1;
+
+  printf("%s\n", curdir);
 
   return 0;
 }
 
 int validate_cd_argv(int argc, char** argv) {
-  // TODO: Fill it!
+  if (argc != 2) return 0;
+  if (strcmp(argv[0], "cd") != 0) return 0;
+
+  struct stat buf;
+  stat(argv[1], &buf);
+
+  if (!S_ISDIR(buf.st_mode)) return 0;
+
   return 1;
 }
 
 int validate_pwd_argv(int argc, char** argv) {
-  // TODO: Fill it!
+  if (argc != 1) return 0;
+  if (strcmp(argv[0], "pwd") != 0) return 0;
+
   return 1;
 }