--- hardware/arduino/cores/arduino/CDC.cpp
+++ hardware/arduino/cores/arduino/CDC.cpp
@@ -114,64 +99,43 @@
 }
 
 
-int _serialPeek = -1;
-void Serial_::begin(uint16_t baud_count)
+void Serial_::begin(unsigned long baud_count)
 {
+	peek_buffer = -1;
 }
 
-void Serial_::end(void)
+void Serial_::begin(unsigned long baud_count, byte config)
 {
+	peek_buffer = -1;
 }
 
-void Serial_::accept(void) 
+void Serial_::end(void)
 {
-	ring_buffer *buffer = &cdc_rx_buffer;
-	int i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE;
-	
-	// if we should be storing the received character into the location
-	// just before the tail (meaning that the head would advance to the
-	// current location of the tail), we're about to overflow the buffer
-	// and so we don't write the character or advance the head.
-
-	// while we have room to store a byte
-	while (i != buffer->tail) {
-		int c = USB_Recv(CDC_RX);
-		if (c == -1)
-			break;	// no more data
-		buffer->buffer[buffer->head] = c;
-		buffer->head = i;
-
-		i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE;
-	}
 }
 
 int Serial_::available(void)
 {
-	ring_buffer *buffer = &cdc_rx_buffer;
-	return (unsigned int)(SERIAL_BUFFER_SIZE + buffer->head - buffer->tail) % SERIAL_BUFFER_SIZE;
+	if (peek_buffer >= 0) {
+		return 1 + USB_Available(CDC_RX);
+	}
+	return USB_Available(CDC_RX);
 }
 
 int Serial_::peek(void)
 {
-	ring_buffer *buffer = &cdc_rx_buffer;
-	if (buffer->head == buffer->tail) {
-		return -1;
-	} else {
-		return buffer->buffer[buffer->tail];
-	}
+	if (peek_buffer < 0)
+		peek_buffer = USB_Recv(CDC_RX);
+	return peek_buffer;
 }
 
 int Serial_::read(void)
 {
-	ring_buffer *buffer = &cdc_rx_buffer;
-	// if the head isn't ahead of the tail, we don't have any characters
-	if (buffer->head == buffer->tail) {
-		return -1;
-	} else {
-		unsigned char c = buffer->buffer[buffer->tail];
-		buffer->tail = (unsigned int)(buffer->tail + 1) % SERIAL_BUFFER_SIZE;
+	if (peek_buffer >= 0) {
+		int c = peek_buffer;
+		peek_buffer = -1;
 		return c;
 	}
+	return USB_Recv(CDC_RX);
 }
 
 void Serial_::flush(void)
