first few communication steps work
diff --git a/sam3s_example/simtrace/phone.c b/sam3s_example/simtrace/phone.c
index b08e894..e1dc32a 100644
--- a/sam3s_example/simtrace/phone.c
+++ b/sam3s_example/simtrace/phone.c
@@ -122,6 +122,8 @@
 static uint32_t state;
 extern uint8_t rcvdChar;
 
+extern volatile uint8_t timeout_occured;
+
 /*-----------------------------------------------------------------------------
  *          Interrupt routines
  *-----------------------------------------------------------------------------*/
@@ -272,6 +274,7 @@
     }
 */
 
+    Timer_Init();
 }
 
 void send_ATR(uint8_t *ATR, uint8_t status, uint32_t transferred, uint32_t remaining)
@@ -287,7 +290,7 @@
 void sendResponse( uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t remaining)
 {
     int i;
-    TRACE_INFO("sendResponse, stat: %X, transf: %x, remain: %x", status, transferred, remaining);
+    TRACE_INFO("sendResp, stat: %X, trnsf: %x, rem: %x\n\r", status, transferred, remaining);
     TRACE_INFO("Resp: %x %x %x .. %x", pArg[0], pArg[1], pArg[2], pArg[transferred-1]);
 
     for ( i = 0; i < transferred; i++ ) {
@@ -307,18 +310,31 @@
         printf(" rr ");
         /*  DATA_IN for host side is data_out for simtrace side   */
         /* FIXME: Performancewise sending a USB packet for every byte is a disaster */
-        PR("b:%x %x %x %x %x.\n\r", buf.buf[0], buf.buf[1],buf.buf[2], buf.buf[3], buf.buf[4]);
-        USBD_Write( DATAIN, buf.buf, BUFLEN, 0, 0 );
+        ret = USBD_Write( DATAIN, buf.buf, BUFLEN, 0, 0 );
         //USBD_Write( DATAIN, msg, BUFLEN, 0, 0 );
+        PR("b:%x %x %x %x %x.\n\r", buf.buf[0], buf.buf[1],buf.buf[2], buf.buf[3], buf.buf[4]);
 
         rcvdChar = 0;
-
-        if ((ret = USBD_Read(DATAOUT, pBuffer, MAX_MSG_LEN, (TransferCallback)&sendResponse, pBuffer)) == USBD_STATUS_SUCCESS) {
-            TRACE_INFO("Reading started sucessfully (wait_resp)");
-            state = WAIT_CMD_PC;
-        } else {
-            TRACE_INFO("USB Error: %X", ret);
-        }
+    } else if (timeout_occured  && buf.idx != 0) {
+        printf(" to ");
+        ret = USBD_Write( DATAIN, buf.buf, buf.idx, 0, 0 );
+        timeout_occured = 0;
+        buf.idx = 0;
+        rcvdChar = 0;
+        PR("b:%x %x %x %x %x.\n\r", buf.buf[0], buf.buf[1],buf.buf[2], buf.buf[3], buf.buf[4]);
+    } else {
+        printf(".");
+        return;
+    }
+    if ((ret = USBD_Read(DATAOUT, pBuffer, MAX_MSG_LEN, 
+                (TransferCallback)&sendResponse, pBuffer)) == USBD_STATUS_SUCCESS) {
+        TRACE_INFO("wait_rsp\n\r");
+//        state = WAIT_CMD_PC;
+        buf.idx = 0;
+        TC0_Counter_Reset();
+    } else {
+        TRACE_INFO("USB Err: %X", ret);
+        return;
     }
 }
 
@@ -343,7 +359,6 @@
 // FIXME: remove:
 //    uint8_t ATR[] = {0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19}; 
 //    send_ATR(ATR, (sizeof(ATR)/sizeof(ATR[0])));
-
     switch (state) {
         case RST_RCVD:
             USBD_Write( INT, &msg, 1, 0, 0 );
@@ -357,9 +372,13 @@
             }
             break;
         case WAIT_CMD_PHONE:
+// FIXME:            TC0_Counter_Reset();
             wait_for_response(pBuffer);
             break;
+        case NONE:
+            break;
         default:
+//            TRACE_INFO(":(");
             break;
     }