diff --git a/student-distrib/lib.c b/student-distrib/lib.c
index ee909f3876bcc20c710894f3ee838ba473d1be58..3fd4942a8cc9e9bc0047529cf75cffbc61ff4558 100644
--- a/student-distrib/lib.c
+++ b/student-distrib/lib.c
@@ -78,7 +78,7 @@ void scroll_up(int32_t term_id)
 
     uint8_t * video_memory;
 
-    if(term_id == -1 || term_id == control.cur_terminal /*|| control.cur_terminal == control.running_terminal*/)
+    if(term_id == -1)
         video_memory = video_mem;
     else
         video_memory = control.terminal[term_id].vid_mem;
@@ -272,10 +272,18 @@ void putc(uint8_t c, int32_t term_id) {
 
     uint8_t * video_memory;
 
-    if(term_id == -1 || term_id == control.cur_terminal /*|| control.cur_terminal == control.running_terminal*/)
+    int32_t terminal_to_write;
+
+    if(term_id == -1)
+    {
+        terminal_to_write = control.cur_terminal;
         video_memory = video_mem;
+    }
     else
+    {
+        terminal_to_write = term_id;
         video_memory = control.terminal[term_id].vid_mem;
+    }
 
     // if(init_ready)
     //     video_memory = control.terminal[control.cur_terminal].vid_mem;
@@ -289,42 +297,42 @@ void putc(uint8_t c, int32_t term_id) {
 
     if(c == '\n' || c == '\r')
     {
-        control.terminal[control.cur_terminal].terminal_y++;
-        control.terminal[control.cur_terminal].terminal_x = 0;
+        control.terminal[terminal_to_write].terminal_y++;
+        control.terminal[terminal_to_write].terminal_x = 0;
     } 
     else 
     {
-        *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[control.cur_terminal].terminal_y 
-                                            + control.terminal[control.cur_terminal].terminal_x) << 1)) = c;
+        *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[terminal_to_write].terminal_y 
+                                               + control.terminal[terminal_to_write].terminal_x) << 1)) = c;
 
-        *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[control.cur_terminal].terminal_y 
-                               + control.terminal[control.cur_terminal].terminal_x) << 1) + 1) = ATTRIB;
+        *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[terminal_to_write].terminal_y 
+                                  + control.terminal[terminal_to_write].terminal_x) << 1) + 1) = ATTRIB;
 
-        control.terminal[control.cur_terminal].terminal_x++;
+        control.terminal[terminal_to_write].terminal_x++;
         //control.terminal[control.cur_terminal].terminal_x %= NUM_COLS;
 
-        control.terminal[control.cur_terminal].terminal_y = 
-       (control.terminal[control.cur_terminal].terminal_y + 
-      ((control.terminal[control.cur_terminal].terminal_x%NUM_COLS) / NUM_COLS)) % NUM_ROWS;
+        control.terminal[terminal_to_write].terminal_y = 
+       (control.terminal[terminal_to_write].terminal_y + 
+      ((control.terminal[terminal_to_write].terminal_x%NUM_COLS) / NUM_COLS)) % NUM_ROWS;
 
     }
 
-    if(control.terminal[control.cur_terminal].terminal_x == NUM_COLS && 
-       control.terminal[control.cur_terminal].terminal_y <  NUM_ROWS-1)
+    if(control.terminal[terminal_to_write].terminal_x == NUM_COLS && 
+       control.terminal[terminal_to_write].terminal_y <  NUM_ROWS-1)
     {
-        control.terminal[control.cur_terminal].terminal_y++;
-        control.terminal[control.cur_terminal].terminal_x = 0;
+        control.terminal[terminal_to_write].terminal_y++;
+        control.terminal[terminal_to_write].terminal_x = 0;
     }
-    else if((control.terminal[control.cur_terminal].terminal_x == NUM_COLS    && 
-             control.terminal[control.cur_terminal].terminal_y == NUM_ROWS-1) || 
-             control.terminal[control.cur_terminal].terminal_y  > NUM_ROWS-1)
+    else if((control.terminal[terminal_to_write].terminal_x == NUM_COLS    && 
+             control.terminal[terminal_to_write].terminal_y == NUM_ROWS-1) || 
+             control.terminal[terminal_to_write].terminal_y  > NUM_ROWS-1)
     {
         scroll_up(term_id);
-        control.terminal[control.cur_terminal].terminal_x = 0;
-        control.terminal[control.cur_terminal].terminal_y = NUM_ROWS-1;
+        control.terminal[terminal_to_write].terminal_x = 0;
+        control.terminal[terminal_to_write].terminal_y = NUM_ROWS-1;
     }
-
-    update_cursor();
+    if(term_id == -1)
+        update_cursor();
 }
 
 /* int8_t* itoa(uint32_t value, int8_t* buf, int32_t radix);
diff --git a/student-distrib/proc.c b/student-distrib/proc.c
index c232e2b4875d5ea0251605fffd07c9d697cf3893..d363798237d922b3698fa0fb7e3f034d7f84dbb6 100644
--- a/student-distrib/proc.c
+++ b/student-distrib/proc.c
@@ -21,7 +21,7 @@ void control_initilization(void)
     control.total_prog_count = 0;
     control.cur_terminal     = 0;
     control.visible_terminal = 0;
-    control.running_terminal = 0;
+    //control.running_terminal = 0;
 }
 
 /* Checks if FD is valid
@@ -84,8 +84,14 @@ void pcb_init(pcb_t* pcb , uint8_t* parsed_cmd, uint8_t (*argv)[MAX_ARGUMENT_SIZ
     pcb->parent_pid = 0;
 
     pcb->arg_num = arg_num;
+
+    pcb->running_terminal = control.cur_terminal;
+    pcb->shell_flag = 0;
+
     memcpy(pcb->cmd, parsed_cmd, MAX_COMMAND_SIZE);
-    for(i = 0; i < MAX_ARGUMENT_NUM; i++) memcpy(pcb->argv[i],argv[i], MAX_ARGUMENT_SIZE);
+
+    for(i = 0; i < MAX_ARGUMENT_NUM; i++)
+        memcpy(pcb->argv[i],argv[i], MAX_ARGUMENT_SIZE);
 
     pcb->parent_esp  = 0;
     pcb->parent_ebp  = 0;
diff --git a/student-distrib/syscall.c b/student-distrib/syscall.c
index c470d105a51bd4fcfa60d2dda4464730cd88e5bc..c570b260c3971f781afc9dce1dcca9c6b5fe25a3 100644
--- a/student-distrib/syscall.c
+++ b/student-distrib/syscall.c
@@ -14,8 +14,11 @@ int32_t halt (uint8_t status){
     cli();
 
     pcb_t* pcb_cur = control.terminal[control.cur_terminal].pcb;
+    //pcb_t * pcb_cur = control.curr_pcb;
     pcb_t* pcb_prev = pcb_cur->parent_pcb;
 
+    printf("[halt] entered halt with pcb = %x\n", pcb_cur);
+
     /* set all present flags in PCB to "Not In Use" */
     for (i = 0; i < MAX_FILE_NUM; i++)
     {
@@ -117,10 +120,13 @@ int32_t execute(const uint8_t* command){
 
     arg_num = (ret > -1) ? ret : 0;
 
-    if(ret == -2)
-    {
+    if(ret == -1)
+
+        return -1;
+
+    else if(ret == -2)
+
         exit();
-    }
 
     //------------------ 1: Executable check -----------------------------------
         dentry_t dentry;
@@ -170,6 +176,9 @@ int32_t execute(const uint8_t* command){
         pcb_init(&pcb, parsed_cmd, argv, pid, arg_num);
         pcb_t* pcb_ptr = get_pcb(pid);
 
+        //control.curr_pcb = pcb_ptr;
+
+        pcb_ptr->running_terminal = control.cur_terminal;
 
         // Save current ESP, EBP
         asm volatile("          \n\
@@ -183,12 +192,17 @@ int32_t execute(const uint8_t* command){
 
         control.terminal[control.cur_terminal].pcb = pcb_ptr;
 
+        if (strncmp("shell", (int8_t*)parsed_cmd, 5) == 0)
+        {
+            printf("entered shell if\n");
+            control.terminal[control.cur_terminal].pcb->shell_flag = 1;
+        }
+
 
     //--------------------- 6: context switch-----------------------------------
 
         //set running terminal
-        if(ret != -1)
-            control.running_terminal = control.cur_terminal;
+        //control.running_terminal = control.cur_terminal;
 
         // update SS0 and ESP0 in Task State Segment when switching context
         tss.ss0 = KERNEL_DS;
@@ -255,7 +269,7 @@ int32_t read (int32_t fd_n, void* buf, int32_t nbytes){
     /* Enable for keyboard interrupts */
     sti();
 
-    ret =  control.terminal[control.cur_terminal].pcb->fd[fd_n].fileop_ptr.read(fd_n, buf, nbytes);
+    ret = control.terminal[control.cur_terminal].pcb->fd[fd_n].fileop_ptr.read(fd_n, buf, nbytes);
 
     return ret;
 
diff --git a/student-distrib/terminal.c b/student-distrib/terminal.c
index 5efb86de5c2086ce5c44458b8322d49b5051544a..aa196f115e87640690b98a1ba2554e560fba76cc 100644
--- a/student-distrib/terminal.c
+++ b/student-distrib/terminal.c
@@ -91,6 +91,16 @@ int32_t terminal_read(int32_t fd, void* buf, int32_t nbytes)
 int32_t terminal_write(int32_t fd, const void* buf, int32_t nbytes)
 {
 
+    pcb_t * pcb_ptr = current_pcb();
+
+    int32_t terminal_to_write = (pcb_ptr->running_terminal == control.cur_terminal) ? -1 : control.cur_terminal;
+
+    if(pcb_ptr->shell_flag)
+        terminal_to_write = -1;
+
+    //printf("[terminal_write] shell_flag = %d\n", pcb_ptr->shell_flag);
+    //printf("[terminal_write] cur_terminal %d , running_terminal = %d , terminal_to_write = %d\n", control.cur_terminal, pcb_ptr->running_terminal, terminal_to_write);
+
     // checks if buf is null or overflow
     if((int8_t*)buf == NULL /*|| nbytes > MAX_BUF_SIZE-1*/)
         return -1;
@@ -98,7 +108,7 @@ int32_t terminal_write(int32_t fd, const void* buf, int32_t nbytes)
     int i;
     // prints content to terminal
     for(i = 0; i < nbytes; i++)
-        putc( ((int8_t*)buf)[i] , control.cur_terminal);
+        putc( ((int8_t*)buf)[i] , terminal_to_write);
 
     return nbytes;
 }
diff --git a/student-distrib/types.h b/student-distrib/types.h
index e7aba01c8e4da3cccf26e511408fc41fc3d5e130..13e79f2dafde29dd2c7ab5b6346fbf715c3f970d 100644
--- a/student-distrib/types.h
+++ b/student-distrib/types.h
@@ -139,6 +139,9 @@ typedef struct pcb {
 
     file_object_t   fd[MAX_FILE_NUM]; /* File descriptor array */
 
+    int32_t         running_terminal;
+    int32_t         shell_flag;
+
     uint32_t        pid;              /* Holds current process ID */
     uint32_t        current_esp;        //newly added, need initilization
     uint32_t        current_ebp;        //newly added, need initilization
@@ -179,9 +182,10 @@ volatile int32_t    buffer_index;
 typedef struct control {
 
     terminal_t  terminal[MAX_TERMINAL];
+    pcb_t *     curr_pcb;
     int32_t     cur_terminal;
     int32_t     visible_terminal;
-    int32_t     running_terminal;
+    //int32_t     running_terminal;
     int32_t     total_prog_count;
     uint32_t    filesys_start;
     int32_t     pid_array[MAX_PROCESS];