diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp
index 31fc51aa9c55caf52d02c96245c29dee6ea81c11..076526b1c6d7de056ff8e17c629a09985ec3a039 100644
--- a/cores/arduino/SERCOM.cpp
+++ b/cores/arduino/SERCOM.cpp
@@ -158,14 +158,16 @@ void SERCOM::initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize ch
 	initClockNVIC();
 
 	//Setting the CTRLA register
-	sercom->SPI.CTRLA.reg =	SERCOM_SPI_CTRLA_MODE(SPI_MASTER_OPERATION) |
-							SERCOM_SPI_CTRLA_DOPO(mosi) |
-							SERCOM_SPI_CTRLA_DIPO(miso) |
-							dataOrder << SERCOM_SPI_CTRLA_DORD_Pos;
+	sercom->SPI.CTRLA.reg =	SERCOM_SPI_CTRLA_MODE_SPI_MASTER |
+							            SERCOM_SPI_CTRLA_DOPO(mosi) |
+							            SERCOM_SPI_CTRLA_DIPO(miso) |
+							            dataOrder << SERCOM_SPI_CTRLA_DORD_Pos;
 
 	//Setting the CTRLB register
 	sercom->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_CHSIZE(charSize) |
-							(0x1ul) << SERCOM_SPI_CTRLB_RXEN_Pos;	//Active the SPI receiver.
+							            SERCOM_SPI_CTRLB_RXEN;	//Active the SPI receiver.
+
+
 }
 
 void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
@@ -184,8 +186,8 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
 		cpol = 1;
 
 	//Setting the CTRLA register
-	sercom->SPI.CTRLA.reg |=	cpha << SERCOM_SPI_CTRLA_CPHA_Pos |
-								cpol << SERCOM_SPI_CTRLA_CPOL_Pos;
+	sercom->SPI.CTRLA.reg |=	( cpha << SERCOM_SPI_CTRLA_CPHA_Pos ) |
+								            ( cpol << SERCOM_SPI_CTRLA_CPOL_Pos );
 
 	//Synchronous arithmetic
 	sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(baudrate);
@@ -194,7 +196,7 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
 void SERCOM::resetSPI()
 {
 	//Setting the Software Reset bit to 1
-	sercom->SPI.CTRLA.bit.SWRST = 0x1u;
+	sercom->SPI.CTRLA.bit.SWRST = 1;
 
 	//Wait both bits Software Reset from CTRLA and SYNCBUSY are equal to 0
 	while(sercom->SPI.CTRLA.bit.SWRST || sercom->SPI.SYNCBUSY.bit.SWRST);
@@ -203,19 +205,23 @@ void SERCOM::resetSPI()
 void SERCOM::enableSPI()
 {
 	//Setting the enable bit to 1
-	sercom->SPI.CTRLA.bit.ENABLE = 0x1ul;
+	sercom->SPI.CTRLA.bit.ENABLE = 1;
 
-	//Waiting then enable bit from SYNCBUSY is equal to 0;
-	while(sercom->SPI.SYNCBUSY.bit.ENABLE);
+	while(sercom->SPI.SYNCBUSY.bit.ENABLE)
+  {
+    //Waiting then enable bit from SYNCBUSY is equal to 0;
+  }
 }
 
 void SERCOM::disableSPI()
 {
 	//Setting the enable bit to 0
-	sercom->SPI.CTRLA.bit.ENABLE = 0x0ul;
+	sercom->SPI.CTRLA.bit.ENABLE = 0;
 
-	//Waiting then enable bit from SYNCBUSY is equal to 0;
-	while(sercom->SPI.SYNCBUSY.bit.ENABLE);
+	while(sercom->SPI.SYNCBUSY.bit.ENABLE)
+  {
+    //Waiting then enable bit from SYNCBUSY is equal to 0;
+  }
 }
 
 void SERCOM::setDataOrderSPI(SercomDataOrder dataOrder)
@@ -237,7 +243,7 @@ void SERCOM::setBaudrateSPI(uint8_t divider)
 	//Register enable-protected
 	disableSPI();
 
-	sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(SERCOM_FREQ_REF / divider);
+	sercom->SPI.BAUD.reg = calculateBaudrateSynchronous( SERCOM_FREQ_REF / divider );
 
 	enableSPI();
 }
@@ -265,12 +271,27 @@ void SERCOM::setClockModeSPI(SercomSpiClockMode clockMode)
 }
 void SERCOM::writeDataSPI(uint8_t data)
 {
-	sercom->SPI.DATA.bit.DATA = data;
+  while( sercom->SPI.INTFLAG.bit.DRE == 0 )
+  {
+    // Waiting Data Registry Empty
+  }
+
+	sercom->SPI.DATA.bit.DATA = data; // Writing data into Data register
+
+  while( sercom->SPI.INTFLAG.bit.TXC == 0 || sercom->SPI.INTFLAG.bit.DRE == 0 )
+  {
+    // Waiting Complete Transmission
+  }
 }
 
 uint16_t SERCOM::readDataSPI()
 {
-	return sercom->SPI.DATA.reg;
+  while( sercom->SPI.INTFLAG.bit.DRE == 0 || sercom->SPI.INTFLAG.bit.RXC == 0 )
+  {
+    // Waiting Complete Reception
+  }
+
+	return sercom->SPI.DATA.bit.DATA;  // Reading data
 }
 
 bool SERCOM::isBufferOverflowErrorSPI()
@@ -284,17 +305,17 @@ bool SERCOM::isDataRegisterEmptySPI()
 	return sercom->SPI.INTFLAG.bit.DRE;
 }
 
-bool SERCOM::isTransmitCompleteSPI()
-{
-	//TXC : Transmit complete
-	return sercom->SPI.INTFLAG.bit.TXC;
-}
-
-bool SERCOM::isReceiveCompleteSPI()
-{
-	//RXC : Receive complete
-	return sercom->SPI.INTFLAG.bit.RXC;
-}
+//bool SERCOM::isTransmitCompleteSPI()
+//{
+//	//TXC : Transmit complete
+//	return sercom->SPI.INTFLAG.bit.TXC;
+//}
+//
+//bool SERCOM::isReceiveCompleteSPI()
+//{
+//	//RXC : Receive complete
+//	return sercom->SPI.INTFLAG.bit.RXC;
+//}
 
 uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate)
 {
@@ -600,14 +621,14 @@ void SERCOM::initClockNVIC( void )
 		IdNvic = SERCOM5_IRQn;
 	}
 
-	//Setting NVIC
+	// Setting NVIC
 	NVIC_EnableIRQ(IdNvic);
 	NVIC_SetPriority (IdNvic, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority */
 
 	//Setting clock
 	GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( clockId ) | // Generic Clock 0 (SERCOMx)
-						GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
-						GCLK_CLKCTRL_CLKEN ;
+						          GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
+						          GCLK_CLKCTRL_CLKEN ;
 
 	while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
 	{
diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c
index d65e159abf8ae282ac8daf06b6d9c12e727a6cdb..2c3723e622c2c60b354d543728b23132661f7a7c 100644
--- a/cores/arduino/wiring.c
+++ b/cores/arduino/wiring.c
@@ -32,6 +32,7 @@ extern "C" {
  */
 uint32_t SystemCoreClock=1000000ul ;
 
+/*
 void calibrateADC()
 {
   volatile uint32_t valeur = 0;
@@ -48,7 +49,7 @@ void calibrateADC()
   }
 
   valeur = valeur/5;
-}
+}*/
 
 /*
  * Arduino Zero board initialization
diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp
index 8eb5ac2976e3deb1ade58553c7a296b823cc5a85..4369aba907d9cab47725c46fb112aee4bda3803e 100644
--- a/libraries/SPI/SPI.cpp
+++ b/libraries/SPI/SPI.cpp
@@ -11,36 +11,43 @@
 #include "SPI.h"
 #include "wiring_digital.h"
 #include "assert.h"
+#include "variant.h"
 
-
-SPIClass::SPIClass(SERCOM *s)
+SPIClass::SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI)
 {
-	assert(s != NULL );
-	sercom = s;
+	assert(p_sercom != NULL );
+	_p_sercom = p_sercom;
+
+  _uc_pinMiso = uc_pinMISO;
+  _uc_pinSCK = uc_pinSCK;
+  _uc_pinMosi = uc_pinMOSI;
 }
 
-void SPIClass::begin() {
-	// PIO init 
-	pinPeripheral(18, g_APinDescription[18].ulPinType);
-	pinPeripheral(20, g_APinDescription[20].ulPinType);
-	pinPeripheral(21, g_APinDescription[21].ulPinType);
+void SPIClass::begin()
+{
+  // PIO init
+  pinPeripheral(_uc_pinMiso, g_APinDescription[_uc_pinMiso].ulPinType);
+  pinPeripheral(_uc_pinSCK, g_APinDescription[_uc_pinSCK].ulPinType);
+  pinPeripheral(_uc_pinMosi, g_APinDescription[_uc_pinMosi].ulPinType);
+
 	// Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first.
-	sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST);
-	sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000);
+	_p_sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST);
+	_p_sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000);
 	
-	sercom->enableSPI();
+	_p_sercom->enableSPI();
 }
 
-void SPIClass::end() {
-	sercom->resetSPI();
+void SPIClass::end()
+{
+	_p_sercom->resetSPI();
 }
 
 void SPIClass::setBitOrder(BitOrder order)
 {
 	if(order == LSBFIRST)
-		sercom->setDataOrderSPI(LSB_FIRST);
+		_p_sercom->setDataOrderSPI(LSB_FIRST);
 	else
-		sercom->setDataOrderSPI(MSB_FIRST);
+		_p_sercom->setDataOrderSPI(MSB_FIRST);
 }
 
 void SPIClass::setDataMode(uint8_t mode)
@@ -48,19 +55,19 @@ void SPIClass::setDataMode(uint8_t mode)
 	switch(mode)
 	{
 		case SPI_MODE0:
-			sercom->setClockModeSPI(SERCOM_SPI_MODE_0);
+			_p_sercom->setClockModeSPI(SERCOM_SPI_MODE_0);
 			break;
 			
 		case SPI_MODE1:
-			sercom->setClockModeSPI(SERCOM_SPI_MODE_1);
+			_p_sercom->setClockModeSPI(SERCOM_SPI_MODE_1);
 			break;
 			
 		case SPI_MODE2:
-			sercom->setClockModeSPI(SERCOM_SPI_MODE_2);
+			_p_sercom->setClockModeSPI(SERCOM_SPI_MODE_2);
 			break;
 			
 		case SPI_MODE3:
-			sercom->setClockModeSPI(SERCOM_SPI_MODE_3);
+			_p_sercom->setClockModeSPI(SERCOM_SPI_MODE_3);
 			break;
 		
 		default:
@@ -70,22 +77,16 @@ void SPIClass::setDataMode(uint8_t mode)
 
 void SPIClass::setClockDivider(uint8_t div)
 {
-	sercom->setBaudrateSPI(div);
+	_p_sercom->setBaudrateSPI(div);
 }
 
 byte SPIClass::transfer(uint8_t data)
 {
-	//Can writing new data?
-	while(!sercom->isDataRegisterEmptySPI());
-	
 	//Writing the data
-	sercom->writeDataSPI(data);
-	
-	//Data sent? new data to read?
-	while(!sercom->isTransmitCompleteSPI() || !sercom->isReceiveCompleteSPI());
+	_p_sercom->writeDataSPI(data);
 	
 	//Read data
-	return sercom->readDataSPI();
+	return _p_sercom->readDataSPI();
 }
 
 void SPIClass::attachInterrupt() {
@@ -96,4 +97,4 @@ void SPIClass::detachInterrupt() {
 	// Should be disableInterrupt()
 }
 
-SPIClass SPI(&sercom4);
+SPIClass SPI(&sercom4, 18, 20, 21);
diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h
index 1d27bb6e3eaafff25822d483cca83de4eeb296c1..db8a45b00321d44211ceced827c9cf4dcb1a5d0b 100644
--- a/libraries/SPI/SPI.h
+++ b/libraries/SPI/SPI.h
@@ -12,7 +12,6 @@
 #define _SPI_H_INCLUDED
 
 #include "variant.h"
-#include "SERCOM.h"
 #include "wiring_constants.h"
 
 #define SPI_MODE0 0x02
@@ -22,7 +21,7 @@
 
 class SPIClass {
   public:
-	SPIClass(SERCOM *s);
+	SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI);
 
 	byte transfer(uint8_t data);
 
@@ -34,15 +33,18 @@ class SPIClass {
 	void end();
 	
 	void setBitOrder(BitOrder order);
-	void setDataMode(uint8_t mode);
-	void setClockDivider(uint8_t div);
+	void setDataMode(uint8_t uc_mode);
+	void setClockDivider(uint8_t uc_div);
 
   private:
-	SERCOM *sercom;
+	SERCOM *_p_sercom;
+	uint8_t _uc_pinMiso;
+	uint8_t _uc_pinMosi;
+	uint8_t _uc_pinSCK;
 };
 
 #if SPI_INTERFACES_COUNT > 0
-extern SPIClass SPI;
+  extern SPIClass SPI;
 #endif
 
 #endif