diff --git a/include/built_in.h b/include/built_in.h
index 9937389ece4e604cb4285c0be7677e8e955a7116..73cc5e4888cc5e10a546e8365e56242e548e01fa 100644
--- a/include/built_in.h
+++ b/include/built_in.h
@@ -1,7 +1,11 @@
 #ifndef BUILT_IN_H_
 #define BUILT_IN_H_
 
-typedef int (*built_in_command_do)(int, char**);
+struct pidStorage{
+	int pid_arr[2][50], arr_i, arr_n;
+};
+
+typedef int (*built_in_command_do)(int, char**, struct pidStorage*);
 typedef int (*built_in_command_validate)(int, char**);
 
 struct built_in_command
@@ -28,7 +32,7 @@ struct aliased_command
     If success, return 0.
     Else if arguments are not valid, return -1.
 */
-int do_cd(int argc, char** argv);
+int do_cd(int argc, char** argv, struct pidStorage *ps);
 
 /**
   do_pwd(argc, argv)
@@ -41,15 +45,15 @@ int do_cd(int argc, char** argv);
     If success, return 0.
     Else if arguments are not valid, return -1.
 */
-int do_pwd(int argc, char** argv);
+int do_pwd(int argc, char** argv, struct pidStorage *ps);
 
 struct aliased_command** get_aliased_commands();
 
 int get_no_alias();
 
-int do_alias(int argc, char** argv);
+int do_alias(int argc, char** argv, struct pidStorage *ps);
 
-int do_fg(int argc, char** argv);
+int do_fg(int argc, char** argv, struct pidStorage *ps);
 
 /**
   validate_cd_argv(argc, argv)
diff --git a/include/commands.h b/include/commands.h
index 31581163c220b1b68c2e8d764603889a732a6355..de9640d7c9f2c14393908d0e3b54fce1713291ec 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -1,17 +1,15 @@
 #ifndef MYSH_COMMANDS_H_
 #define MYSH_COMMANDS_H_
 
+#include "built_in.h"
+
 struct single_command
 {
   int argc;
   char** argv;
 };
 
-struct pidStorage{
-	int pid_arr[2][50], arr_i, arr_n;
-};
-
-int exute_command(struct single_command* com, char* tmp_path);
+int exute_command(struct single_command* com, char* tmp_path, struct pidStorage *ps);
 
 int execv_handler(char *path, char **argv);
 
diff --git a/src/built_in.c b/src/built_in.c
index 67f88324ccb67b7611fde2bc40cee6ce00ad7b9a..50b36685582075fc06cd032ed292cc88f418b0ae 100644
--- a/src/built_in.c
+++ b/src/built_in.c
@@ -4,6 +4,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/wait.h>
 #include <unistd.h>
 #include <linux/limits.h>
 
@@ -12,7 +13,7 @@
 static struct aliased_command* aliased_commands[128] = { NULL, };
 static int n_aliased_command = 0;
 
-int do_cd(int argc, char** argv) {
+int do_cd(int argc, char** argv, struct pidStorage *ps) {
   if (!validate_cd_argv(argc, argv))
     return -1;
 
@@ -22,7 +23,7 @@ int do_cd(int argc, char** argv) {
   return 0;
 }
 
-int do_pwd(int argc, char** argv) {
+int do_pwd(int argc, char** argv, struct pidStorage *ps) {
   if (!validate_pwd_argv(argc, argv))
     return -1;
 
@@ -44,7 +45,7 @@ int get_no_alias(){
 	return n_aliased_command;
 }
 
-int do_alias(int argc, char** argv) {
+int do_alias(int argc, char** argv, struct pidStorage *ps) {
 	int i, j, tmp_i, flag;
 	struct aliased_command *tmp_ac;
 	char print_buff[PATH_MAX];
@@ -93,12 +94,27 @@ int do_alias(int argc, char** argv) {
 	return 0;
 }
 
-int do_fg(int argc, char** argv) {
+int do_fg(int argc, char** argv, struct pidStorage *ps) {
   if (!validate_fg_argv(argc, argv))
     return -1;
 
-  // TODO: Fill this.
+  int num;
 
+  if(argc == 1)
+    num = 1;
+  else
+    num = atoi(argv[1]);
+
+  if(num <= 0 || num > ps->arr_n)
+    return -1;
+
+  int status;
+
+  waitpid(ps->pid_arr[ps->arr_i][num - 1], &status, 0);
+  if(num < ps->arr_n)
+    for(int i=num; i<ps->arr_n; i++)
+      ps->pid_arr[ps->arr_i][i - 1] = ps->pid_arr[ps->arr_i][i];
+  (ps->arr_n)--;
   return 0;
 }
 
@@ -130,7 +146,7 @@ int validate_alias_argv(int argc, char** argv) {
 }
 
 int validate_fg_argv(int argc, char** argv) {
-  if (argc != 1) return 0;
+  if (argc > 2) return 0;
   if (strcmp(argv[0], "fg") != 0) return 0;
   
   return 1;
diff --git a/src/commands.c b/src/commands.c
index 24fbe68ae09025e18f4217ed87a2d12f88cdfca2..37b3c5c824919fecbb6c8f399750173439fd7c17 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -7,9 +7,8 @@
 #include <sys/wait.h>
 #include <linux/limits.h>
 
-#include "commands.h"
-#include "built_in.h"
 #include "utils.h"
+#include "commands.h"
 
 #define RE_PATH_LENGTH 5
 
@@ -83,26 +82,26 @@ int evaluate_command(int n_commands, struct single_command (*commands)[512], str
 					fprintf(stderr, "%s: fork error occurs\n", com->argv[0]);
 					return -1;
 				case 0:
-					status = exute_command(com, tmp_path);
+					status = exute_command(com, tmp_path, ps);
 					exit(status);
 				default:
 					printf("%d\n", p_id);
 					ps->pid_arr[ps->arr_i][ps->arr_n++] = p_id;
 			}
 		} else {
-			return exute_command(com, tmp_path);
+			return exute_command(com, tmp_path, ps);
 		}
 	}
 	return 0;
 }
 
-int exute_command(struct single_command* com, char* tmp_path){
+int exute_command(struct single_command* com, char* tmp_path, struct pidStorage *ps){
 	int status, i;
 	int built_in_pos = is_built_in_command(com->argv[0]);
 	
 	if (built_in_pos != -1) {
 		if (built_in_commands[built_in_pos].command_validate(com->argc, com->argv)) {
-			if (built_in_commands[built_in_pos].command_do(com->argc, com->argv) != 0) {
+			if (built_in_commands[built_in_pos].command_do(com->argc, com->argv, ps) != 0) {
 				fprintf(stderr, "%s: Error occurs\n", com->argv[0]);
 			}
 		} else {
diff --git a/src/main.c b/src/main.c
index 064ccedd283abce17139f365162ef8f409a9797e..a93c9dfa51d116abb2e943da1c86fa3539c53e73 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,7 +25,7 @@ int main()
   	  if (ret && WIFEXITED(status)){
   	    printf("%d done\n", ps.pid_arr[ps.arr_i][i]);
 	  } else {
-	  	ps.pid_arr[1 - ps.arr_i][j++] = ps.pid_arr[ps.arr_i][i];
+	    ps.pid_arr[1 - ps.arr_i][j++] = ps.pid_arr[ps.arr_i][i];
 	  }
 	}
 	ps.arr_i = 1 - ps.arr_i;
@@ -50,6 +50,5 @@ int main()
       break;
     }
   }
-
   return 0;
 }