diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..58e2dff6088ca9141c055458f267412d8729753b 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -0,0 +1,80 @@
+#UARTinterr:
+    # There is space on _uart_buff
+    # _uart_buff[0]=UARTstatus, [1]=UARTcontrol, [2]=data_inp, [3]=new,
+    #           [4]=$ra, [5]=$a0, [6]=$a1, [7]=$a2, [8]=$a3
+    #k0 = _uart_buff
+
+    andi  $a1, $k1, UART_rx_irq # Is this reception?
+    beq   $a1, $zero, UARTret   #   no, maybe transmission?
+    nop
+
+    #handle reception
+    lw    $a1, 4($a0)           # Read data from device
+    nop                         #   and store it to UART's buffer
+    sw    $a1, 2*4($k0)         #   and return from interrupt
+    addiu $a1, $zero, 1
+    sw    $a1, 3*4($k0)         # Signal new arrival
+                                # Jedian: when a new char is on the UART's buffer, 
+                                #         i have to enqueue it and update nrx.
+
+    # saving used registers on _uart_buff
+    sw    $5, 9*4($k0)
+    sw    $6, 10*4($k0)
+    sw    $7, 11*4($k0)
+    
+    # check if queue is full, maybe increment
+    lui   $5, %hi(nrx)
+    ori   $5, $5, %lo(nrx)
+    lw    $7, 0($5)
+    slti  $6, $7, 16
+    beq   $6, $zero, overrun
+    nop
+    addiu $7, $7, 1
+    sw    $7, 0($5)
+
+    # enqueue
+    lui   $5, %hi(rx_tl)        # get rx tail address
+    ori   $5, $5, %lo(rx_tl)    
+
+    lw    $7, 0($5)
+    nop
+    addiu $7, $7, 1             # increment in 1 the tail of the circular queue
+    andi  $7, $7, 0xf           # % 16
+    sw    $7, 0($5)
+
+    #### stores on queue on tail
+    lui   $6, %hi(rx_q)         # get queue address
+    ori   $6, $6, %lo(rx_q)
+
+    addu  $6, $7, $6            # calculate address to move new char
+    lw    $7, 2*4($k0)          # get char to be stored
+    nop
+    sb    $7, 0($6)             # and store it!
+
+    #### process rx_tl -- update tail
+    #lw   $7, 0($5)
+    #nop
+
+overrun:
+
+    # do something if queue is full
+    #... (doing absolutely nothing besides stacking and unstacking regs)
+
+    # loading back used registers
+    lw    $5, 9*4($k0)
+    lw    $6, 10*4($k0)
+    lw    $7, 11*4($k0)
+
+    #Precisa coisar o nrx (incrementar)
+
+#UARTinterr2:
+#    andi  $a1, $k1, UART_tx_irq # Is this transmission?
+#    beq   $a1, $zero, UARTret   # no, ignore it and return
+#    nop
+
+    #handle transmission
+    # ... TODO
+
+    # Lembrar de inicializar os hd e tl com 0 no comeco do main
+
+#UARTret: 
diff --git a/cMIPS/tests/handlerUARTjedi2.s b/cMIPS/tests/handlerUARTjedi2.s
index ec4f00b10019483187cd265c12b3407f8ecdedc3..58e2dff6088ca9141c055458f267412d8729753b 100644
--- a/cMIPS/tests/handlerUARTjedi2.s
+++ b/cMIPS/tests/handlerUARTjedi2.s
@@ -22,6 +22,16 @@
     sw    $6, 10*4($k0)
     sw    $7, 11*4($k0)
     
+    # check if queue is full, maybe increment
+    lui   $5, %hi(nrx)
+    ori   $5, $5, %lo(nrx)
+    lw    $7, 0($5)
+    slti  $6, $7, 16
+    beq   $6, $zero, overrun
+    nop
+    addiu $7, $7, 1
+    sw    $7, 0($5)
+
     # enqueue
     lui   $5, %hi(rx_tl)        # get rx tail address
     ori   $5, $5, %lo(rx_tl)    
@@ -42,9 +52,14 @@
     sb    $7, 0($6)             # and store it!
 
     #### process rx_tl -- update tail
-    #lw    $7, 0($5)
+    #lw   $7, 0($5)
     #nop
 
+overrun:
+
+    # do something if queue is full
+    #... (doing absolutely nothing besides stacking and unstacking regs)
+
     # loading back used registers
     lw    $5, 9*4($k0)
     lw    $6, 10*4($k0)
diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c
new file mode 100644
index 0000000000000000000000000000000000000000..84ddda76a82171d9e53416bb3e87845d82042e7e
--- /dev/null
+++ b/cMIPS/tests/jedidafu.c
@@ -0,0 +1,115 @@
+#include "cMIPS.h"
+
+typedef struct UARTdriver {
+int rx_hd ; // reception queue head index
+int rx_tl ; // reception queue tail index
+char rx_q [16]; // reception queue
+int tx_hd ; // transmission queue head index
+int tx_tl ; // transmission queue tail index
+char tx_q [16]; // transmission queue
+int nrx ; // number of characters in rx_queue
+int ntx ; // number of spaces in tx_queue
+} UARTdriver ;
+extern UARTdriver Ud ;
+
+
+typedef struct control { // control register fields (uses only ls byte)
+  int ign   : 24,        // ignore uppermost bits
+    rts     : 1,         // Request to Send output (bit 7)
+    ign2    : 2,         // bits 6,5 ignored
+    intTX   : 1,         // interrupt on TX buffer empty (bit 4)
+    intRX   : 1,         // interrupt on RX buffer full (bit 3)
+    speed   : 3;         // 4,8,16..256 tx-rx clock data rates  (bits 0..2)
+} Tcontrol;
+
+typedef struct status {  // status register fields (uses only ls byte)
+  unsigned int ign : 24, // ignore uppermost 3 bytes
+  cts     : 1,           // Clear To Send input=1 (bit 7)
+  txEmpty : 1,           // TX register is empty (bit 6)
+  rxFull  : 1,           // octet available from RX register (bit 5)
+  int_TX_empt: 1,        // interrupt pending on TX empty (bit 4)
+  int_RX_full: 1,        // interrupt pending on RX full (bit 3)
+  ign1    : 1,           // ignored (bit 2)
+  framing : 1,           // framing error (bit 1)
+  overun  : 1;           // overun error (bit 0)
+} Tstatus;
+
+
+typedef union ctlStat { // control + status on same address
+  Tcontrol  ctl;        // write-only
+  Tstatus   stat;       // read-only
+} TctlStat;
+
+typedef union data {    // data registers on same address
+  int tx;               // write-only
+  int rx;               // read-only
+} Tdata;
+
+typedef struct serial {
+  TctlStat cs;
+  Tdata    d;
+} Tserial;
+
+char Getc () {
+    char c ;
+    if ( Ud.nrx > 0) {
+        disableInterr();
+        // exclui handler enquanto altera Ud
+        Ud.nrx -= 1;
+        c = Ud.rx_q [ Ud.rx_hd ];
+        Ud.rx_hd = (Ud.rx_hd + 1) & 15; // modulo 16
+        enableInterr();
+    } else {
+        c = 0;
+    }
+    return c ;
+}
+
+
+int main(void) { // receive a string through the UART serial interface
+  int i, j;
+  volatile int state;
+  volatile Tserial *uart;  // tell GCC not to optimize away code
+  volatile Tstatus status;
+  Tcontrol ctrl;
+
+  uart = (void *)IO_UART_ADDR; // bottom of UART address range
+
+  ctrl.ign   = 0;
+  ctrl.rts   = 0;   // make RTS=0 to hold RemoteUnit
+  ctrl.ign2  = 0;
+  ctrl.intTX = 0;
+  ctrl.intRX = 1;
+  ctrl.speed = 1;   // operate at the second highest data rate
+  uart->cs.ctl = ctrl;
+
+  i = -1;
+
+  ctrl.ign   = 0;
+  ctrl.rts   = 1;   // make RTS=1 to activate RemoteUnit
+  ctrl.ign2  = 0;
+  ctrl.intTX = 0;
+  ctrl.intRX = 1;
+  ctrl.speed = 1;   // operate at the second highest data rate
+  uart->cs.ctl = ctrl;
+
+  do {
+    state = i = i+1;
+    while(Ud.rx_tl == Ud.rx_hd){ to_stdout('d'); state = 1- state;}
+
+    j = -1;
+    to_stdout('=');
+    do{
+        j = j + 1;
+        //to_stdout(Ud.rx_q[j]);
+        to_stdout(Getc());
+        if(Ud.rx_q[j] == '\n')
+            print(Ud.nrx); //nada ou string completa
+    }while(j<15);
+    to_stdout( '-');
+
+  } while (i<5);
+
+  return(state+i);
+
+}