diff --git a/include/commands.h b/include/commands.h
index b8aadb0f7d624c21a721e5f533d92605197ccd27..178349db763dab98bd0e8e43d247e18f4ad9a6bb 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -27,19 +27,6 @@ int do_cd(int argc, char** argv);
 */
 int do_pwd(int argc, char** argv);
 
-/**
-  do_alias(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_alias(int argc, char** argv);
-
 /**
   validate_cd_argv(argc, argv)
 
@@ -57,13 +44,5 @@ int validate_cd_argv(int argc, char** argv);
 */
 int validate_pwd_argv(int argc, char** argv);
 
-/**
-  validate_alias_argv(argc, argv)
-
-  returns:
-   If success, return 1. (true)
-   Else return 0. (false)
- */
-int validate_alias_argv(int argc, char** argv);
 
 #endif // MYSH_COMMANDS_H_
diff --git a/src/commands.c b/src/commands.c
index dfe494e6a6aec04641982f4f687f98f361ac3b68..28a7cfcab1b75297ffe7b750166cfbff1f19b6c7 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -19,14 +19,6 @@ int do_pwd(int argc, char** argv) {
   return 0;
 }
 
-int do_alias(int argc, char** argv) {
-  if (!validate_alias_argv(argc, argv))
-    return -1;
-
-  // TODO: Fill it!
-
-  return 0;
-}
 
 int validate_cd_argv(int argc, char** argv) {
   // TODO: Fill it!
@@ -38,7 +30,3 @@ int validate_pwd_argv(int argc, char** argv) {
   return 1;
 }
 
-int validate_alias_argv(int argc, char** argv) {
-  // TODO: Fill it!
-  return 1;
-}
diff --git a/src/main.c b/src/main.c
index efb87c30eda6b91c0e8743848cbae1fb509b454f..fddc6fc498fd16b68f563b15fe9853ce2292bfdb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,6 +5,47 @@
 #include "commands.h"
 #include "utils.h"
 
+/**
+ * Aliased command element
+ *
+ * Example: 
+ *
+ * $ alias cd_to_etc="cd /etc/"
+ *
+ * alias: alias of command. (e.g. "cd_to_etc")
+ * command: aliased command. (e.g. "cd /etc/")
+ */
+struct aliased_command
+{
+  char alias[512];
+  char command[8096];
+};
+
+static struct aliased_command* aliased_commands[128] = { NULL, };
+static int n_aliased_command = 0;
+
+/**
+  do_alias(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_alias(int argc, char** argv);
+
+/**
+  validate_alias_argv(argc, argv)
+
+  returns:
+   If success, return 1. (true)
+   Else return 0. (false)
+ */
+int validate_alias_argv(int argc, char** argv);
+
 static void release_argv(int argc, char*** argv);
 
 int main()
@@ -16,6 +57,7 @@ int main()
   while (1) {
     fgets(buf, 8096, stdin);
 
+apply_alias:
     mysh_parse_command(buf, &argc, &argv);
 
     if (strcmp(argv[0], "") == 0) {
@@ -28,9 +70,21 @@ int main()
       if (do_pwd(argc, argv)) {
         fprintf(stderr, "pwd: Invalid arguments\n");
       }
+    } else if (strcmp(argv[0], "alias") == 0) {
+      if (do_alias(argc, argv)) {
+        fprintf(stderr, "alias: Invalid arguments\n");
+      }
     } else if (strcmp(argv[0], "exit") == 0) {
       goto release_and_exit;
     } else {
+      for (int i = 0; i < n_aliased_command; ++i) {
+        if (strcmp(argv[0], aliased_commands[i]->alias) == 0) {
+          // TODO: fill here!
+
+          goto apply_alias;
+        }
+      }
+
       fprintf(stderr, "%s: command not found\n", argv[0]);
     }
 release_and_continue:
@@ -41,6 +95,13 @@ release_and_exit:
     break;
   }
 
+  for (int i = 0; i < n_aliased_command; ++i) {
+    if (aliased_commands[i]) {
+      free(aliased_commands[i]);
+      aliased_commands[i] = NULL;
+    }
+  }
+
   return 0;
 }
 
@@ -51,3 +112,19 @@ static void release_argv(int argc, char*** argv) {
   free(*argv);
   *argv = NULL;
 }
+
+int do_alias(int argc, char** argv) {
+  if (!validate_alias_argv(argc, argv))
+    return -1;
+
+  // TODO: Fill it!
+
+  return 0;
+}
+
+int validate_alias_argv(int argc, char** argv) {
+  // TODO: Fill it!
+  return 1;
+}
+
+