diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp
index 273b03e7458b9ccbee18b871b04685a8b4c7349a..8abfd3aca6f5b25de9e679138e5ab1adddc40001 100644
--- a/libraries/Wire/Wire.cpp
+++ b/libraries/Wire/Wire.cpp
@@ -219,13 +219,26 @@ void TwoWire::onService(void)
 {
   if ( sercom->isSlaveWIRE() )
   {
-    if(sercom->isAddressMatch())  //Address Match
+    if(sercom->isStopDetectedWIRE() || 
+        (sercom->isAddressMatch() && sercom->isRestartDetectedWIRE())) //Stop or Restart detected
     {
       sercom->prepareAckBitWIRE();
       sercom->prepareCommandBitsWire(0x03);
 
-      //Is a request ?
-      if(sercom->isMasterReadOperationWIRE())
+      //Calling onReceiveCallback, if exists
+      if(onReceiveCallback)
+      {
+        onReceiveCallback(available());
+      }
+      
+      rxBuffer.clear();
+    }
+    else if(sercom->isAddressMatch())  //Address Match
+    {
+      sercom->prepareAckBitWIRE();
+      sercom->prepareCommandBitsWire(0x03);
+
+      if(sercom->isMasterReadOperationWIRE()) //Is a request ?
       {
         //Calling onRequestCallback, if exists
         if(onRequestCallback)
@@ -247,19 +260,6 @@ void TwoWire::onService(void)
 
       sercom->prepareCommandBitsWire(0x03);
     }
-    else if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE()) //Stop or Restart detected
-    {
-      sercom->prepareAckBitWIRE();
-      sercom->prepareCommandBitsWire(0x03);
-
-      //Calling onReceiveCallback, if exists
-      if(onReceiveCallback)
-      {
-        onReceiveCallback(available());
-      }
-      
-      rxBuffer.clear();
-    }
   }
 }