diff --git a/cores/arduino/RingBuffer.cpp b/cores/arduino/RingBuffer.cpp
index f0b3ed1dff1d34909139e2343861de6e89533729..123f895edb16002394fd28308becf11e861dd2e4 100644
--- a/cores/arduino/RingBuffer.cpp
+++ b/cores/arduino/RingBuffer.cpp
@@ -22,13 +22,12 @@
 RingBuffer::RingBuffer( void )
 {
     memset( _aucBuffer, 0, SERIAL_BUFFER_SIZE ) ;
-    _iHead=0 ;
-    _iTail=0 ;
+    clear();
 }
 
 void RingBuffer::store_char( uint8_t c )
 {
-  int i = (uint32_t)(_iHead + 1) % SERIAL_BUFFER_SIZE ;
+  int i = nextIndex(_iHead);
 
   // if we should be storing the received character into the location
   // just before the tail (meaning that the head would advance to the
@@ -41,3 +40,42 @@ void RingBuffer::store_char( uint8_t c )
   }
 }
 
+void RingBuffer::clear()
+{
+	_iHead = 0;
+	_iTail = 0;
+}
+
+int RingBuffer::read_char()
+{
+	if(_iTail == _iHead)
+		return -1;
+	
+	int value = _aucBuffer[_iTail];
+	_iTail = nextIndex(_iTail);
+	
+	return value;
+}
+
+int RingBuffer::available()
+{
+	int delta = _iHead - _iTail;
+	
+	if(delta < 0)
+		return SERIAL_BUFFER_SIZE + delta;
+	else
+		return delta;
+}
+
+int RingBuffer::peek()
+{
+	if(_iTail == _iHead)
+		return -1;
+		
+	return _aucBuffer[_iTail];
+}
+
+int RingBuffer::nextIndex(int index)
+{
+	return (uint32_t)(index + 1) % SERIAL_BUFFER_SIZE;
+}
\ No newline at end of file
diff --git a/cores/arduino/RingBuffer.h b/cores/arduino/RingBuffer.h
index 28309df459c45ed2e672ed7054b7b57c81de16c2..030620b39f1250e2acc9eec75de5e8443a15cc3d 100644
--- a/cores/arduino/RingBuffer.h
+++ b/cores/arduino/RingBuffer.h
@@ -37,6 +37,13 @@ class RingBuffer
   public:
     RingBuffer( void ) ;
     void store_char( uint8_t c ) ;
+	void clear();
+	int read_char();
+	int available();
+	int peek();
+	
+  private:
+	int nextIndex(int index);
 } ;
 
 #endif /* _RING_BUFFER_ */
diff --git a/cores/arduino/SERCOMUart.cpp b/cores/arduino/SERCOMUart.cpp
index bb5325fcacaf72affd751cc83a2eb01a22195d35..c3aa4a139514b64d407eb59df53a015328c4b304 100644
--- a/cores/arduino/SERCOMUart.cpp
+++ b/cores/arduino/SERCOMUart.cpp
@@ -20,7 +20,8 @@ void SERCOMUart::begin(uint16_t baudrate, uint8_t config)
 	sercom->enableUART();
 }
 
-void SERCOMUart::end(){
+void SERCOMUart::end()
+{
 	sercom->resetUART();
 	rxBuffer.clear();
 }
@@ -47,7 +48,7 @@ void SERCOMUart::IrqHandler()
 
 bool SERCOMUart::available()
 {
-	return rxBuffer.available_char();
+	return rxBuffer.available();
 }
 
 int SERCOMUart::peek()