diff --git a/include/commands.h b/include/commands.h
index 178349db763dab98bd0e8e43d247e18f4ad9a6bb..43f055d8d79a8873a6ba0cc6869d49cfa4951e9b 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -1,6 +1,7 @@
 #ifndef MYSH_COMMANDS_H_
 #define MYSH_COMMANDS_H_
 
+char print_buff[1024];
 /**
   do_cd(argc, argv)
 
diff --git a/mysh b/mysh
index 954c05f41dc9da77d666cd13ce665aa60ef354da..6e63160a92de0d6787455b300a761c03074585e3 100755
Binary files a/mysh and b/mysh differ
diff --git a/src/commands.c b/src/commands.c
index 4adfea4e961161a24e34ef2ee62b3d038db54cee..ca43e2c8282dff7d0ea13c28a251e76b855031d5 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -3,8 +3,6 @@
 #include <stdio.h>
 #include "commands.h"
 
-char print_buff[1024];
-
 int do_cd(int argc, char** argv) {
 	if (!validate_cd_argv(argc, argv))
     	return -1;
diff --git a/src/main.c b/src/main.c
index c7bd6320658668089b23ee0a774e3740c5c9acd1..34bd4c44db6e375a34707f1e219b827ee916b460 100644
--- a/src/main.c
+++ b/src/main.c
@@ -51,8 +51,9 @@ static void release_argv(int argc, char*** argv);
 int main()
 {
   char buf[8096];
-  int argc;
+  int argc, i, j;
   char** argv;
+
   while (1) {
     fgets(buf, 8096, stdin);
 
@@ -76,10 +77,11 @@ apply_alias:
     } else if (strcmp(argv[0], "exit") == 0) {
       goto release_and_exit;
     } else {
-      for (int i = 0; i < n_aliased_command; ++i) {
+      for (i = 0; i < n_aliased_command; ++i) {
         if (strcmp(argv[0], aliased_commands[i]->alias) == 0) {
-          // TODO: fill here!
-
+		  for(j = 0; aliased_commands[i]->command[j] != '\0'; j++)
+		  	buf[j] = aliased_commands[i]->command[j];
+		  buf[j] = '\0';
           goto apply_alias;
         }
       }
@@ -94,7 +96,7 @@ release_and_exit:
     break;
   }
 
-  for (int i = 0; i < n_aliased_command; ++i) {
+  for (i = 0; i < n_aliased_command; ++i) {
     if (aliased_commands[i]) {
       free(aliased_commands[i]);
       aliased_commands[i] = NULL;
@@ -113,17 +115,55 @@ static void release_argv(int argc, char*** argv) {
 }
 
 int do_alias(int argc, char** argv) {
-  if (!validate_alias_argv(argc, argv))
-    return -1;
-
-  // TODO: Fill it!
-
-  return 0;
+	int i, j, tmp_i, flag;
+	struct aliased_command *tmp_ac;
+
+	if (!validate_alias_argv(argc, argv))
+		return -1;
+	if(argc == 1){
+		for (i = 0; i < n_aliased_command; ++i) {
+			if (aliased_commands[i])
+				printf("alias %s='%s'\n", aliased_commands[i]->alias, aliased_commands[i]->command);
+		}
+		return 0;
+	} else {
+		tmp_i = 0;
+		flag = 0;
+		tmp_ac = malloc(sizeof(struct aliased_command));
+		tmp_ac->alias[0] = '\0';
+		tmp_ac->command[0] = '\0';
+		for(i = 0; argv[1][i] != '\0'; i++){
+			print_buff[tmp_i++] = argv[1][i];
+			if(!flag && argv[1][i] == '=' && argv[1][i+1] == '"'){
+				print_buff[tmp_i - 1] = '\0';
+				for(j = 0; j<n_aliased_command; j++)
+					if(strcmp(print_buff, aliased_commands[j]->alias) == 0){
+						free(tmp_ac);
+						return -1;
+					}
+				for(j = 0; j<tmp_i; j++)
+					tmp_ac->alias[j] = print_buff[j];
+				tmp_i = 0;
+				flag = 1;
+				i++;
+			}else if(flag && argv[1][i] == '"'){
+				print_buff[tmp_i - 1] = '\0';
+				for(j = 0; j<tmp_i; j++)
+					tmp_ac->command[j] = print_buff[j];
+				aliased_commands[n_aliased_command++] = tmp_ac;
+				return 0;
+			}
+		}
+		if(tmp_ac->alias[0] == '\0' || tmp_ac->command[0] == '\0'){
+			free(tmp_ac);
+			return -1;
+		}
+	}
+	return 0;
 }
 
 int validate_alias_argv(int argc, char** argv) {
-  // TODO: Fill it!
-  return 1;
+	if(argc > 2)
+		return 0;
+	return 1;
 }
-
-
diff --git a/src/utils.c b/src/utils.c
index cbd10c8b5e7bec6b87e19988b312b10331b60af5..b787367940eb73f432fedbc7323fe5a0ddb3683a 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -6,17 +6,18 @@ void mysh_parse_command(const char* command,
 	char point;
 	char buf[300];
 	char *tmp_argv[100];
-	int buf_i, command_i, argv_i, i;
+	int buf_i, command_i, argv_i, i, flag;
 	
 	buf_i = 0;
 	command_i = 0;
 	argv_i = 0;
+	flag = 0;
 	point = command[command_i++];
 	
 	while(point != '\n'){
 	    buf[buf_i++] = point;
 	
-	    if(point == ' '){
+	    if(!flag && point == ' '){
 	            buf[buf_i - 1] = '\0';
 	            tmp_argv[argv_i] = malloc(buf_i * sizeof(char));
 	            for(i=0; i<buf_i; i++)
@@ -24,6 +25,9 @@ void mysh_parse_command(const char* command,
 	            buf_i = 0;
 	            argv_i++;
 	    }
+	    if(point == '"')
+	    	flag = 1 - flag;
+	    
 	    point = command[command_i++];
 	}
 	
@@ -41,3 +45,4 @@ void mysh_parse_command(const char* command,
 		(*argv)[i] = tmp_argv[i];
 	*argc = argv_i;
 }
+