diff --git a/sam3s_example/simtrace/phone.c b/sam3s_example/simtrace/phone.c
index 2f79a77..0d077fb 100644
--- a/sam3s_example/simtrace/phone.c
+++ b/sam3s_example/simtrace/phone.c
@@ -90,54 +90,19 @@
  *-----------------------------------------------------------------------------*/
 /** Variable for state of send and receive froom USART */
 static uint8_t StateUsartGlobal = USART_RCV;
-/** Pin reset master card */
-static Pin st_pinIso7816RstMC;
 
-static uint32_t char_stat = 0;
-static char rcvdChar = 0;
+extern uint32_t char_stat;
+extern uint8_t rcvdChar;
 
 /*-----------------------------------------------------------------------------
  *          Interrupt routines
  *-----------------------------------------------------------------------------*/
-/* 
- *  char_stat is zero if no error occured. 
- *  Otherwise it is filled with the content of the status register.
- */
-void USART1_IrqHandler( void )
-{
-    uint32_t stat;
-    char_stat = 0;
-    // Rcv buf full
-/*    if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) {
-        TRACE_DEBUG("Rcv buf full");
-        USART_DisableIt(USART1, US_IDR_RXBUFF);
-    }
-*/
-    uint32_t csr = USART_PHONE->US_CSR;
-
-//    printf(".\n\r");
-
-    if (csr & US_CSR_TXRDY) {
-        /* transmit buffer empty, nothing to transmit */
-    } 
-    if (csr & US_CSR_RXRDY) {
-        stat = (csr&(US_CSR_OVRE|US_CSR_FRAME|
-                        US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
-                        (1<<10)));
-
-        if (stat == 0 ) {
-            /* Get a char */
-            rcvdChar = ((USART_PHONE->US_RHR) & 0xFF);
-        } /* else: error occured */
-        char_stat = stat;
-    }
-}
 
 static void ISR_PhoneRST( const Pin *pPin)
 {
     TRACE_DEBUG("+++++++++ Interrupt!! ISR:0x%x, CSR:0x%x\n\r", pinPhoneRST.pio->PIO_ISR, USART1->US_CSR);
-    phone_state = SEND_ATR;
-    PIO_DisableIt( &pinPhoneRST ) ;
+    // FIXME: What to do on reset?
+    // PIO_DisableIt( &pinPhoneRST ) ;
 }
 
 static void Config_PhoneRST_IrqHandler()
@@ -227,7 +192,7 @@
                                       (1<<10)));
 
     if (status != 0 ) {
-        TRACE_DEBUG("******* status: 0x%X (Overrun: %d, NACK: %d, Timeout: %d, underrun: %d)\n\r",
+        TRACE_DEBUG("******* status: 0x%X (Overrun: %lu, NACK: %lu, Timeout: %lu, underrun: %lu)\n\r",
                     status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
                     ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
 
@@ -240,64 +205,15 @@
     return( status );
 }
 
-
-/** Initializes a ISO driver
- *  \param pPinIso7816RstMC Pin ISO 7816 Rst MC
- */
-// FIXME: This function is implemented in iso7816_4.c !! Only MCK instead of SCK is always taken. Change that!
-void _ISO7816_Init( const Pin pPinIso7816RstMC )
-{
-    TRACE_DEBUG("ISO_Init\n\r");
-
-    /* Pin ISO7816 initialize */
-    st_pinIso7816RstMC  = pPinIso7816RstMC;
-
-    USART_Configure( USART_PHONE,
-                     US_MR_USART_MODE_IS07816_T_0
-// Nope, we aren't master:   
- //                    | US_MR_USCLKS_MCK
-                     | US_MR_USCLKS_SCK
-                     | US_MR_NBSTOP_1_BIT
-                     | 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 */
-                     1,
-                     0);
-    /* 
-    SYNC = 0 (async mode)
-    OVER = 0 (oversampling by 8?)
-    FIDI = 372 (default val on startup before other value is negotiated)
-    USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
-    CD = 1 ?    --> 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(ID_USART_PHONE);
-
-    USART1->US_IDR = 0xffffffff;
-    USART_EnableIt( USART1, US_IER_RXRDY) ;
-    /* 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(USART_PHONE, 1);
-    USART_SetReceiverEnabled(USART_PHONE, 1);
-
-}
-
 void Phone_Master_Init( void ) {
     
     PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ;
     Config_PhoneRST_IrqHandler();
-    _ISO7816_Init(pinIso7816RstMC);
 
+    _ISO7816_Init();
+
+    USART_SetTransmitterEnabled(USART_PHONE, 1);
+    USART_SetReceiverEnabled(USART_PHONE, 1);
 // FIXME: Or do I need to call VBUS_CONFIGURE() here instead, which will call USBD_Connect() later?
 //    USBD_Connect();
 // FIXME: USB clock? USB PMC?
