diff --git a/Makefile b/Makefile
index 81ed9318977ceb095a8a69ba13daef49778b73ac..e09ef551a83b594b76bcb7f3d2fd05112513f7d9 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 CC=gcc -std=c99
 CFLAGS=-I./src -I./include
 LIB=
-OBJ=./src/utils.o ./src/commands.o
+OBJ=./src/utils.o ./src/commands.o ./src/built_in.o
 
 %.o: %.c $(DEPS)
 	$(CC) -c -o $@ $< $(CFLAGS)
diff --git a/include/built_in.h b/include/built_in.h
new file mode 100644
index 0000000000000000000000000000000000000000..b2df0aa845f50b0ba45508d0418a3fbe9643579c
--- /dev/null
+++ b/include/built_in.h
@@ -0,0 +1,61 @@
+#ifndef BUILT_IN_H_
+#define BUILT_IN_H_
+
+typedef int (*built_in_command_do)(int, char**);
+typedef int (*built_in_command_validate)(int, char**);
+
+struct built_in_command
+{
+  char command_name[512];
+  built_in_command_do command_do;
+  built_in_command_validate command_validate;
+};
+
+/**
+  do_cd(argc, argv)
+
+  params:
+    argc: # of arguments. argc must be 2. just "cd" doesn't be approved.
+    argv: a list of arguments.
+
+  returns:
+    If success, return 0.
+    Else if arguments are not valid, return -1.
+*/
+int do_cd(int argc, char** argv);
+
+/**
+  do_pwd(argc, argv)
+
+  params:
+    argc: # of arguments. argc must be 1.
+    argv: a list of arguments.
+
+  returns:
+    If success, return 0.
+    Else if arguments are not valid, return -1.
+*/
+int do_pwd(int argc, char** argv);
+
+int do_fg(int argc, char** argv);
+
+/**
+  validate_cd_argv(argc, argv)
+
+  returns:
+    If success, return 1. (true)
+    Else return 0. (false)
+*/
+int validate_cd_argv(int argc, char** argv);
+/**
+  validate_pwd_argv(argc, argv)
+
+  returns:
+    If success, return 1. (true)
+    Else return 0. (false)
+*/
+int validate_pwd_argv(int argc, char** argv);
+
+int validate_fg_argv(int argc, char** argv);
+
+#endif // BUILT_IN_H_
diff --git a/include/commands.h b/include/commands.h
index 20e9287ca88a7f3cc986b78d1ff4736d7b7c75d1..84355e20c28ea7db7cb2edc74add1e08e711b89a 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -7,47 +7,4 @@ struct single_command
   char** argv;
 };
 
-/**
-  do_cd(argc, argv)
-
-  params:
-    argc: # of arguments. argc must be 2. just "cd" doesn't be approved.
-    argv: a list of arguments.
-
-  returns:
-    If success, return 0.
-    Else if arguments are not valid, return -1.
-*/
-int do_cd(int argc, char** argv);
-
-/**
-  do_pwd(argc, argv)
-
-  params:
-    argc: # of arguments. argc must be 1.
-    argv: a list of arguments.
-
-  returns:
-    If success, return 0.
-    Else if arguments are not valid, return -1.
-*/
-int do_pwd(int argc, char** argv);
-
-/**
-  validate_cd_argv(argc, argv)
-
-  returns:
-    If success, return 1. (true)
-    Else return 0. (false)
-*/
-int validate_cd_argv(int argc, char** argv);
-/**
-  validate_pwd_argv(argc, argv)
-
-  returns:
-    If success, return 1. (true)
-    Else return 0. (false)
-*/
-int validate_pwd_argv(int argc, char** argv);
-
 #endif // MYSH_COMMANDS_H_
diff --git a/include/signal.h b/include/signal.h
new file mode 100644
index 0000000000000000000000000000000000000000..e255fdab7397db93c9228beb1f9d660a91b51801
--- /dev/null
+++ b/include/signal.h
@@ -0,0 +1,8 @@
+#ifndef SIGNAL_H_
+#define SIGNAL_H_
+
+void catch_sigint(int);
+
+void catch_sigtstp(int);
+
+#endif // SIGNAL_H_
diff --git a/src/built_in.c b/src/built_in.c
new file mode 100644
index 0000000000000000000000000000000000000000..5c7964915cadc5784ee73cff8053bc9a9424899d
--- /dev/null
+++ b/src/built_in.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <linux/limits.h>
+
+#include "built_in.h"
+
+int do_cd(int argc, char** argv) {
+  if (!validate_cd_argv(argc, argv))
+    return -1;
+
+  if (chdir(argv[1]) == -1)
+    return -1;
+
+  return 0;
+}
+
+int do_pwd(int argc, char** argv) {
+  if (!validate_pwd_argv(argc, argv))
+    return -1;
+
+  char curdir[PATH_MAX];
+
+  if (getcwd(curdir, PATH_MAX) == NULL)
+    return -1;
+
+  printf("%s\n", curdir);
+
+  return 0;
+}
+
+int do_fg(int argc, char** argv) {
+  if (!validate_fg_argv(argc, argv))
+    return -1;
+
+  // TODO: Fill this.
+
+  return 0;
+}
+
+int validate_cd_argv(int argc, char** argv) {
+  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) {
+  if (argc != 1) return 0;
+  if (strcmp(argv[0], "pwd") != 0) return 0;
+
+  return 1;
+}
+
+int validate_fg_argv(int argc, char** argv) {
+  if (argv != 1) return 0;
+  if (strcmp(argv[0], "fg") != 0) return 0;
+  
+  return 1;
+}
diff --git a/src/commands.c b/src/commands.c
index 3748285057305e22bee2bea5eb2474077fefc1d8..ef5f4b9ca3b9370c093edc42bb1450821227214d 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1,52 +1,10 @@
-#include <stdio.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <linux/limits.h>
-
 #include "commands.h"
+#include "built_in.h"
 
-int do_cd(int argc, char** argv) {
-  if (!validate_cd_argv(argc, argv))
-    return -1;
-
-  if (chdir(argv[1]) == -1)
-    return -1;
-
-  return 0;
-}
-
-int do_pwd(int argc, char** argv) {
-  if (!validate_pwd_argv(argc, argv))
-    return -1;
-
-  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) {
-  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;
-}
+struct built_in_command built_in_commands[] = {
+  { "cd", do_cd, validate_cd_argv },
+  { "pwd", do_pwd, validate_pwd_argv },
+  { "fg", do_fg, validate_fg_argv }
+};
 
-int validate_pwd_argv(int argc, char** argv) {
-  if (argc != 1) return 0;
-  if (strcmp(argv[0], "pwd") != 0) return 0;
 
-  return 1;
-}
diff --git a/src/main.c b/src/main.c
index fd6bffa371b96ab446b0f2b753fd9e00ffbcb34d..18697a3e73f4e97b6f5449f25df348c2eac92418 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,10 +3,9 @@
 #include <string.h>
 
 #include "commands.h"
+#include "built_in.h"
 #include "utils.h"
 
-static void release_argv(int argc, char*** argv);
-
 int main()
 {
   char buf[8096];
@@ -56,11 +55,3 @@ release_and_exit:
 
   return 0;
 }
-
-static void release_argv(int argc, char*** argv) {
-  for (int i = 0; i < argc; ++i) {
-    free((*argv)[i]);
-  }
-  free(*argv);
-  *argv = NULL;
-}
diff --git a/src/signal.c b/src/signal.c
new file mode 100644
index 0000000000000000000000000000000000000000..10b45cae6f0ff705a0dd100d438de4534c8786db
--- /dev/null
+++ b/src/signal.c
@@ -0,0 +1,11 @@
+#include "signal.h"
+
+void catch_sigint(int)
+{
+  // TODO: File this!
+}
+
+void catch_sigtstp(int);
+{
+  // TODO: File this!
+}