diff --git a/sam3s_example/mains/phone_test.c b/sam3s_example/mains/phone_test.c
index b5f3565..0bd2c82 100644
--- a/sam3s_example/mains/phone_test.c
+++ b/sam3s_example/mains/phone_test.c
@@ -73,20 +73,18 @@
     {VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
 };
 
-#ifdef BOARD_ISO7816_BASE_USART
-#undef BOARD_ISO7816_BASE_USART
-#define BOARD_ISO7816_BASE_USART USART1
-#endif
+// SuperSIM ATR: 3B 9A 94 00 92 02 75 93 11 00 01 02 02 19
+static const ATR[] = {0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19};
+#define NONE        0
+#define SEND_ATR    1
+#define AFTER_ATR   2
+static uint8_t phone_state = NONE;
 
-#ifdef BOARD_ISO7816_ID_USART
-#undef BOARD_ISO7816_ID_USART
-#define BOARD_ISO7816_ID_USART   ID_USART1
-#endif
 
 #define ISO7816_PHONE_RST   {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
 static const Pin pinPhoneRST = ISO7816_PHONE_RST;
-#define ISO7816_PHONE_CLK   {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
-static const Pin pinPhoneClk = ISO7816_PHONE_CLK;
+//#define ISO7816_PHONE_CLK   {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
+//static const Pin pinPhoneClk = ISO7816_PHONE_CLK;
 
 /* ===================================================*/
 /*                      Taken from iso7816_4.c        */
@@ -112,7 +110,7 @@
 {
     uint32_t stat;
     
-    stat = BOARD_USART_BASE->US_CSR;    
+    stat = USART1->US_CSR;    
     TRACE_DEBUG("stat: 0x%x, imask: 0x%x", stat, USART1->US_IMR);
 
     // Rcv buf full
@@ -126,7 +124,8 @@
 
 static void ISR_PhoneRST( const Pin *pPin)
 {
-    printf("+++++++++ Interrupt!! %x\n\r", pinPhoneRST.pio->PIO_ISR);   
+    TRACE_DEBUG("+++++++++ Interrupt!! ISR:0x%x, CSR:0x%x\n\r", pinPhoneRST.pio->PIO_ISR, USART1->US_CSR);
+    phone_state = SEND_ATR;
 }
 
 static void Config_PhoneRST_IrqHandler()
@@ -151,13 +150,13 @@
     uint32_t timeout=0;
 
     if( StateUsartGlobal == USART_SEND ) {
-        while((BOARD_ISO7816_BASE_USART->US_CSR & US_CSR_TXEMPTY) == 0) {}
-        BOARD_ISO7816_BASE_USART->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
+        while((USART_PHONE->US_CSR & US_CSR_TXEMPTY) == 0) {}
+        USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
         StateUsartGlobal = USART_RCV;
     }
 
     /* Wait USART ready for reception */
-    while( ((BOARD_ISO7816_BASE_USART->US_CSR & US_CSR_RXRDY) == 0) ) {
+    while( ((USART_PHONE->US_CSR & US_CSR_RXRDY) == 0) ) {
         if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
             TRACE_DEBUG("TimeOut\n\r");
             return( 0 );
@@ -167,23 +166,65 @@
     /* At least one complete character has been received and US_RHR has not yet been read. */
 
     /* Get a char */
-    *pCharToReceive = ((BOARD_ISO7816_BASE_USART->US_RHR) & 0xFF);
+    *pCharToReceive = ((USART_PHONE->US_RHR) & 0xFF);
 
-    status = (BOARD_ISO7816_BASE_USART->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
+    status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
                                       US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
                                       (1<<10)));
 
     if (status != 0 ) {
         TRACE_DEBUG("R:0x%X\n\r", status); 
-        TRACE_DEBUG("R:0x%X\n\r", BOARD_ISO7816_BASE_USART->US_CSR);
-        TRACE_DEBUG("Nb:0x%X\n\r", BOARD_ISO7816_BASE_USART->US_NER );
-        BOARD_ISO7816_BASE_USART->US_CR = US_CR_RSTSTA;
+        TRACE_DEBUG("R:0x%X\n\r", USART_PHONE->US_CSR);
+        TRACE_DEBUG("Nb:0x%X\n\r", USART_PHONE->US_NER );
+        USART_PHONE->US_CR = US_CR_RSTSTA;
     }
 
     /* Return status */
     return( status );
 }
 
+/**
+ * Send a char to ISO7816
+ * \param CharToSend char to be send
+ * \return status of US_CSR
+ */
+static uint32_t ISO7816_SendChar( uint8_t CharToSend )
+{
+    uint32_t status;
+
+    TRACE_DEBUG("********** Send char: %c (0x%X)\n\r", CharToSend, CharToSend);
+
+    if( StateUsartGlobal == USART_RCV ) {
+        USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
+        StateUsartGlobal = USART_SEND;
+    }
+
+    /* Wait USART ready for transmit */
+    while((USART_PHONE->US_CSR & US_CSR_TXRDY) == 0)  {}
+    /* There is no character in the US_THR */
+
+    /* Transmit a char */
+    USART_PHONE->US_THR = CharToSend;
+    
+    status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
+                                      US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
+                                      (1<<10)));
+
+    if (status != 0 ) {
+        TRACE_DEBUG("******* status: 0x%X (Overrun: %d, NACK: %d, Timeout: %d, underrun: %d)\n\r",
+                    status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
+                    ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
+
+        TRACE_DEBUG("E (USART CSR reg):0x%X\n\r", USART_PHONE->US_CSR);
+        TRACE_DEBUG("Nb (Number of errors):0x%X\n\r", USART_PHONE->US_NER );
+        USART_PHONE->US_CR = US_CR_RSTSTA;
+    }
+
+    /* Return status */
+    return( status );
+}
+
+
 /** Initializes a ISO driver
  *  \param pPinIso7816RstMC Pin ISO 7816 Rst MC
  */
@@ -194,15 +235,16 @@
     /* Pin ISO7816 initialize */
     st_pinIso7816RstMC  = pPinIso7816RstMC;
 
-    USART_Configure( BOARD_ISO7816_BASE_USART,
+    USART_Configure( USART_PHONE,
                      US_MR_USART_MODE_IS07816_T_0
-// Nope, we aren't master:   | US_MR_USCLKS_MCK
+// Nope, we aren't master:   
+ //                    | US_MR_USCLKS_MCK
                      | US_MR_USCLKS_SCK
                      | US_MR_NBSTOP_1_BIT
-//                     | US_MR_PAR_EVEN
+                     | US_MR_PAR_EVEN
                      | US_MR_CHRL_8_BIT
-                     | US_MR_CLKO,   /** TODO: This field was set in the original simtrace firmware..why? */
-//                     | (3<<24), /* MAX_ITERATION */
+                     | US_MR_CLKO   /** TODO: This field was set in the original simtrace firmware..why? */
+                     | (3<<24), /* MAX_ITERATION */
                      1,
                      0);
     /* 
@@ -212,17 +254,23 @@
     USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
     CD = 1 ?    --> US_BRGR_CD(1)
     */
-    BOARD_ISO7816_BASE_USART->US_FIDI = 372; 
-    BOARD_ISO7816_BASE_USART->US_BRGR = US_BRGR_CD(1);
+    USART_PHONE->US_FIDI = 372; 
+//    USART_PHONE->US_IDR = (uint32_t) -1;
+    USART_PHONE->US_BRGR = US_BRGR_CD(1);
+//    USART_PHONE->US_BRGR = BOARD_MCK / (372*9600);
+    USART_PHONE->US_TTGR = 5;
 
     /* Configure USART */
-    PMC_EnablePeripheral(BOARD_ISO7816_ID_USART);
+    PMC_EnablePeripheral(ID_USART_PHONE);
 
     /* enable USART1 interrupt */
     NVIC_EnableIRQ( USART1_IRQn ) ;
+    
+//    USART_PHONE->US_IER = US_IER_RXRDY | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | US_IER_NACK | US_IER_ITER;
 
-    USART_SetTransmitterEnabled(BOARD_ISO7816_BASE_USART, 1);
-    USART_SetReceiverEnabled(BOARD_ISO7816_BASE_USART, 1);
+
+    USART_SetTransmitterEnabled(USART_PHONE, 1);
+//    USART_SetReceiverEnabled(USART_PHONE, 1);
 
 }
 
@@ -272,7 +320,7 @@
     PIO_InitializeInterrupts(0);    
 
     /*  Configure ISO7816 driver */
-    PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( &pinsISO7816_PHONE ) ) ;
+    PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ;
     PIO_Configure(pPwr, PIO_LISTSIZE(pPwr));
 
 // FIXME: RST seems to be allways high
@@ -288,7 +336,8 @@
     Config_PhoneRST_IrqHandler();
 
 
-//    USART_EnableIt( USART1, US_IER_RXRDY) ;
+//    USART_EnableIt( USART_PHONE, US_IER_TXRDY) ;
+
     //USART_EnableIt( USART1, 0xffff) ;
    // FIXME: At some point USBD_IrqHandler() should get called and set USBD_STATE_CONFIGURED
   /*  while (USBD_GetState() < USBD_STATE_CONFIGURED) {
@@ -299,8 +348,8 @@
         i++;
     }
 */
-
-    // Infinite loop
+    printf("***** START \n\r");
+    TRACE_DEBUG("%s", "Start while loop\n\r");
     while (1) {
 
 /*        if( USBState == STATE_SUSPEND ) {
@@ -317,25 +366,30 @@
         CCID_SmartCardRequest();
 */
        int j;
-        for( j=0; j < 100; j++ ) {
-       //     ISO7816_GetChar(&buff[j++]);
+        for( j=0; j < 1000; j++ ) {
+        //    ISO7816_GetChar(&buff[j++]);
         }
-       // printf("1 ");
-        for( j=0; j < 100; j++ ) {
+        for( j=0; j < 1000; j++ ) {
         /*    printf("0x%x ", buff[j++]);
             if ((j % 40)==0) {
                 printf("\n\r");    
             }
         */
         }
-//        printf("2\n\r");
         //ISO7816_GetChar(&buff[0]);
         //printf("buf: 0x%x\n\r", buff[0]);
-        
-        /*if (char_avail == 1) {
-            ISO7816_GetChar(&buff[0]);
-            char_avail = 0;
-        }*/
+
+        uint32_t ret=-1;        
+
+        if (phone_state == SEND_ATR) {
+            printf("*");
+            TRACE_DEBUG("Send char %x %x %x ..", ATR[0], ATR[1], ATR[2]);
+            for (j=0; j < sizeof(ATR)/sizeof(ATR[0]); j++) {
+                ret = ISO7816_SendChar(ATR[j]);
+                TRACE_DEBUG("ret: 0x%x\n\r", ret);
+            }
+            phone_state = AFTER_ATR;
+        }
     }
     return 0 ;
 }
