Index: proj/include/proj_macros.h
===================================================================
--- proj/include/proj_macros.h	(revision 297)
+++ proj/include/proj_macros.h	(revision 298)
@@ -1,24 +1,6 @@
 #ifndef PROJ_MACROS_H_INCLUDED
 #define PROJ_MACROS_H_INCLUDED
 
-// WASD Movement Keys
-#define W_MAKE_CODE         0x11    /** @brief W Make Code */
-#define W_BREAK_CODE        0x91    /** @brief W Break Code */
-#define A_MAKE_CODE         0x1E    /** @brief A Make Code */
-#define A_BREAK_CODE        0x9E    /** @brief A Break Code */
-#define S_MAKE_CODE         0x1F    /** @brief S Make Code */
-#define S_BREAK_CODE        0x9F    /** @brief S Break Code */
-#define D_MAKE_CODE         0x20    /** @brief D Make Code */
-#define D_BREAK_CODE        0xA0    /** @brief D Break Code */
-#define CTRL_MAKE_CODE      0x1D    /** @brief CTRL Make Code */
-#define CTRL_BREAK_CODE     0x9D    /** @brief CTRL Break Code */
-#define PLUS_MAKE_CODE      0x1A    /** @brief Plus (+) Make Code */
-#define PLUS_BREAK_CODE     0x9A    /** @brief Plus (+) Break Code */
-#define MINUS_MAKE_CODE     0x35    /** @brief Minus (-) Make Code */
-#define MINUS_BREAK_CODE    0xB5    /** @brief Minus (-) Break Code */
-#define ENTER_MAKE_CODE     0x1C
-#define ENTER_BREAK_CODE    0x9C
-
 // Movement Directions
 #define UP      -1  /** @brief Moving to the top side of screen */
 #define DOWN    1   /** @brief Moving to the bottom side of screen */
@@ -30,16 +12,6 @@
 #define SHOOTER_SPEED   5   /** @brief Shooter speed */
 #define BULLET_SPEED    8   /** @brief Bullet speet */
 
-// Game States
-#define MENU            0
-#define GAME            1
-#define TEST            2
-#define EXIT            3
-
-// Extra Keys
-#define ESC_MAKE_CODE   0x01    /** @brief ESC Make Code */
-#define ESC_BREAK_CODE  0x81    /** @brief ESC Break Code */
-
 // Refresh Rate
 #define REFRESH_RATE    60      /** @brief Screen refresh rate */
 
Index: proj/libs/graph/src/font.c
===================================================================
--- proj/libs/graph/src/font.c	(revision 297)
+++ proj/libs/graph/src/font.c	(revision 298)
@@ -170,9 +170,9 @@
         if(alp_new_buf == NULL) return ALLOC_ERROR;
 
         for(size_t newy = 0; newy < newH; ++newy){
-            size_t y = newy/factor+0.5;
+            size_t y = newy/factor;
             for(size_t newx = 0; newx < newW; ++newx){
-                size_t x = newx/factor+0.5;
+                size_t x = newx/factor;
                 *(alp_new_buf+newx+newy*newW) = *(alp_buf+x+y*W);
             }
         }
Index: proj/libs/kbc/include/keyboard.h
===================================================================
--- proj/libs/kbc/include/keyboard.h	(revision 297)
+++ proj/libs/kbc/include/keyboard.h	(revision 298)
@@ -7,6 +7,28 @@
 
 #include "kbc.h"
 
+#define W_MAKE_CODE             0x11    /** @brief W Make Code */
+#define W_BREAK_CODE            0x91    /** @brief W Break Code */
+#define A_MAKE_CODE             0x1E    /** @brief A Make Code */
+#define A_BREAK_CODE            0x9E    /** @brief A Break Code */
+#define S_MAKE_CODE             0x1F    /** @brief S Make Code */
+#define S_BREAK_CODE            0x9F    /** @brief S Break Code */
+#define D_MAKE_CODE             0x20    /** @brief D Make Code */
+#define D_BREAK_CODE            0xA0    /** @brief D Break Code */
+#define CTRL_MAKE_CODE          0x1D    /** @brief CTRL Make Code */
+#define CTRL_BREAK_CODE         0x9D    /** @brief CTRL Break Code */
+#define PLUS_MAKE_CODE          0x1A    /** @brief Plus (+) Make Code */
+#define PLUS_BREAK_CODE         0x9A    /** @brief Plus (+) Break Code */
+#define MINUS_MAKE_CODE         0x35    /** @brief Minus (-) Make Code */
+#define MINUS_BREAK_CODE        0xB5    /** @brief Minus (-) Break Code */
+#define ENTER_MAKE_CODE         0x1C
+#define ENTER_BREAK_CODE        0x9C
+#define BACKSPACE_MAKE_CODE     0x0E
+#define BACKSPACE_BREAK_CODE    0x8E
+
+#define ESC_MAKE_CODE           0x01    /** @brief ESC Make Code */
+#define ESC_BREAK_CODE          0x81    /** @brief ESC Break Code */
+
 /**
  * @brief Subscribes Keyboard Interrupts and disables Minix Default IH
  * @param interrupt_bit Bit of Interrupt Vector that will be set when Keyboard Interrupt is pending
Index: proj/libs/uart/include/uart.h
===================================================================
--- proj/libs/uart/include/uart.h	(revision 297)
+++ proj/libs/uart/include/uart.h	(revision 298)
@@ -51,6 +51,7 @@
 
 /// NCTP - Non-critical transmission protocol
 int nctp_init(void);
+int nctp_dump(void);
 int nctp_set_processor(void (*proc_func)(const uint8_t*, const size_t));
 int nctp_free(void);
 
Index: proj/libs/uart/src/uart.c
===================================================================
--- proj/libs/uart/src/uart.c	(revision 297)
+++ proj/libs/uart/src/uart.c	(revision 298)
@@ -284,13 +284,18 @@
 
 queue_t *out = NULL;
 queue_t *in  = NULL;
-void (*process)(const uint8_t*, const size_t);
+void (*process)(const uint8_t*, const size_t) = NULL;
 
-int nctp_init(){
+int nctp_init(void){
     out = queue_ctor(); if(out == NULL) return NULL_PTR;
     in  = queue_ctor(); if(in  == NULL) return NULL_PTR;
     return SUCCESS;
 }
+int nctp_dump(void){
+    int ret;
+    if((ret = nctp_free())) return ret;
+    return nctp_init();
+}
 int nctp_set_processor(void (*proc_func)(const uint8_t*, const size_t)){
     process = proc_func;
     return SUCCESS;
@@ -350,7 +355,7 @@
         if(i >= sz) p = realloc(p, sz=2*sz);
     }
     free(queue_top(in)); queue_pop(in);
-    process(p, i);
+    if(process != NULL) process(p, i);
     free(p);
 }
 static int nctp_receive(void){
Index: proj/src/proj.c
===================================================================
--- proj/src/proj.c	(revision 297)
+++ proj/src/proj.c	(revision 298)
@@ -155,6 +155,7 @@
                                     counter_mouse_ih = 0;
                                 }
                                 break;
+                            case COM1_IRQ: nctp_ih(); break;
                             }
                         }
                     }
@@ -294,6 +295,7 @@
 
                                }
                                break;
+                           case COM1_IRQ: nctp_ih(); break;
                            }
                        }
                    }
@@ -323,8 +325,8 @@
     return SUCCESS;
 }
 
-#define CHAT_MAX_SIZE   64
-#define CHAT_MAX_NUM    10
+#define CHAT_MAX_SIZE   75
+#define CHAT_MAX_NUM    19
 
 text_t      *t_text[CHAT_MAX_NUM] = {NULL};
 rectangle_t *r_text               =  NULL;
@@ -357,14 +359,16 @@
 int (chat)(void){
     int r;
 
+    nctp_dump();
     nctp_set_processor(chat_process);
 
     struct packet pp;
 
+    char buffer[CHAT_MAX_SIZE] = "";
     rectangle_t *r_buffer = NULL; {
-        r_buffer = rectangle_ctor(0,0,750,70);
+        r_buffer = rectangle_ctor(0,0,900,70);
         rectangle_set_pos(r_buffer, graph_get_XRes()/2  -rectangle_get_w(r_buffer)/2,
-                                    graph_get_YRes()*0.8-rectangle_get_h(r_buffer)/2);
+                                    graph_get_YRes()*0.87-rectangle_get_h(r_buffer)/2);
         rectangle_set_fill_color   (r_buffer, GRAPH_BLACK);
         rectangle_set_outline_width(r_buffer, 2);
         rectangle_set_outline_color(r_buffer, GRAPH_WHITE);
@@ -378,11 +382,23 @@
         text_set_valign(t_buffer, text_valign_center);
         text_set_color (t_buffer, TEXT_COLOR);
     }
+    text_t      *t_size   = NULL; {
+        t_size = text_ctor(consolas, "");
+        text_set_pos(t_size, rectangle_get_x(r_buffer)+rectangle_get_w(r_buffer)-5,
+                             rectangle_get_y(r_buffer)+rectangle_get_h(r_buffer)-5);
+        text_set_halign(t_size, text_halign_right);
+        text_set_valign(t_size, text_valign_bottom);
+        text_set_color (t_size, TEXT_COLOR);
+        text_set_size  (t_size, 18);
+        char buffer2[20];
+        sprintf(buffer2, "%d/%d", strlen(buffer), CHAT_MAX_SIZE);
+        text_set_text(t_size, buffer2);
+    }
 
     /** r_text */ {
-        r_text = rectangle_ctor(0,0,750,500);
+        r_text = rectangle_ctor(0,0,900,550);
         rectangle_set_pos(r_text, graph_get_XRes()/2  -rectangle_get_w(r_buffer)/2,
-                                  graph_get_YRes()*0.1-rectangle_get_h(r_buffer)/2);
+                                  graph_get_YRes()*0.09);
         rectangle_set_fill_color   (r_text, GRAPH_BLACK);
         rectangle_set_outline_width(r_text, 2);
         rectangle_set_outline_color(r_text, GRAPH_WHITE);
@@ -392,7 +408,7 @@
         for(size_t i = 0; i < CHAT_MAX_NUM; ++i){
             t_text[i] = text_ctor(consolas, " ");
             text_set_pos(t_text[i], rectangle_get_x(r_text)+50,
-                                       rectangle_get_y(r_text)+rectangle_get_h(r_text)-30-30*i);
+                                       rectangle_get_y(r_text)+rectangle_get_h(r_text)-30-25*i);
             text_set_halign(t_text[i], text_halign_left);
             text_set_valign(t_text[i], text_valign_bottom);
             text_set_color (t_text[i], TEXT_COLOR);
@@ -402,11 +418,7 @@
     /// loop stuff
     int ipc_status;
     message msg;
-
-    char buffer[CHAT_MAX_SIZE] = "";
-
     int good = true;
-
     while (good) {
         /* Get a request message. */
         if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) {
@@ -426,6 +438,7 @@
 
                                 rectangle_draw(r_buffer);
                                 text_draw(t_buffer);
+                                text_draw(t_size);
 
                                 rectangle_draw(r_text);
                                 for(size_t i = 0; i < CHAT_MAX_NUM; ++i) text_draw(t_text[i]);
@@ -434,8 +447,8 @@
                                 graph_draw();
                                 break;
                             case KBC_IRQ:
-                                if ((scancode[0]) == ESC_BREAK_CODE) good = false;
-                                else if ((scancode[0]) == ENTER_MAKE_CODE) {
+                                if      (scancode[0] == ESC_BREAK_CODE) good = false;
+                                else if (scancode[0] == ENTER_MAKE_CODE) {
                                     hltp_send_string(buffer);
                                     char buffer2[CHAT_MAX_SIZE+3] = "> ";
                                     strncat(buffer2, buffer, strlen(buffer));
@@ -451,17 +464,19 @@
                                             text_set_halign(t_text[i], text_halign_right);
                                         }
                                     }
-
                                     buffer[0] = '\0';
-                                    text_set_text(t_buffer, buffer);
-                                }
-                                else {
+                                } else if(scancode[0] == BACKSPACE_MAKE_CODE){
+                                    buffer[strlen(buffer)-1] = '\0';
+                                } else {
                                     char c = map_makecode(scancode[0]);
                                     if (c == ERROR_CODE) break;
                                     if(strlen(buffer) < CHAT_MAX_SIZE) strncat(buffer, &c, 1);
-                                    else                    printf("Char limit exceeded\n");
-                                    text_set_text(t_buffer, buffer);
+                                    else                               printf("Char limit exceeded\n");
                                 }
+                                text_set_text(t_buffer, buffer);
+                                char buffer2[20];
+                                sprintf(buffer2, "%d/%d", strlen(buffer), CHAT_MAX_SIZE);
+                                text_set_text(t_size, buffer2);
                             case MOUSE_IRQ:
                                 if (counter_mouse_ih >= 3) {
                                     mouse_parse_packet(packet_mouse_ih, &pp);
@@ -469,13 +484,10 @@
                                     counter_mouse_ih = 0;
                                 }
                                 break;
-                            case COM1_IRQ:
-                                nctp_ih();
-                                break;
+                            case COM1_IRQ: nctp_ih(); break;
                             }
                         }
                     }
-
                     break;
                 default:
                     break; /* no other notifications expected: do nothing */
@@ -491,5 +503,7 @@
     rectangle_dtor(r_text);
     for(size_t i = 0; i < CHAT_MAX_NUM; ++i) text_dtor(t_text[i]);
 
+    nctp_set_processor(NULL);
+
     return SUCCESS;
 }
