diff --git a/src/shared/drivers/canbus/CanProtocol.h b/src/shared/drivers/canbus/CanProtocol.h
index de9f52462d0c5efaba73b3e7c4e08a1e7bc23caf..73d751d55c78800e69ed2692eb458e3f3d08da0f 100644
--- a/src/shared/drivers/canbus/CanProtocol.h
+++ b/src/shared/drivers/canbus/CanProtocol.h
@@ -88,21 +88,19 @@ public:
     getPacket()  // return the packet, if buffer is empty return an empty packet
     {
         CanData temp;
-        mutex.lock();
+        miosix::Lock<miosix::FastMutex> l(mutex);
         if (!buffer.isEmpty())
         {
             temp = buffer.pop();
         }
-        mutex.unlock();
 
         return temp;
     }
 
     bool isEmpty()
     {
-        mutex.lock();
+        miosix::Lock<miosix::FastMutex> l(mutex);
         return buffer.isEmpty();
-        mutex.unlock();
     }
 
     void waitEmpty() { buffer.waitUntilNotEmpty(); }
@@ -175,46 +173,63 @@ protected:
             {
 
                 packet   = can->getRXBuffer().pop().packet;
-                sourceId = packet.id & idMask.source;
-                if (data[sourceId].canId == -1 ||
-                    (data[sourceId].canId & idMask.source) == sourceId)
+                sourceId = (packet.id & idMask.source) >> 15;
+                // TRACE("source id %d\n", sourceId);
+                if (sourceId >= 0 &&
+                    sourceId < NPACKET)  // check for maximum size
                 {
-                    uint32_t leftToSend = 63 - (packet.id & idMask.leftToSend);
-                    if (packet.id & idMask.firstPacket)  // it is a first
-                                                         // packet of a data;
-                    {
-                        data[sourceId].len = leftToSend + 1;
-                        data[sourceId].canId =
-                            packet.id >> 7;  // discard the sequence number
-                    }
-
-                    if ((data[sourceId].len - (data[sourceId].nRec + 1)) ==
-                        leftToSend)
+                    if (data[sourceId].canId == -1 ||
+                        (((data[sourceId].canId << 7) & idMask.source) >> 15) ==
+                            sourceId)
                     {
+                        uint32_t leftToSend =
+                            63 - (packet.id & idMask.leftToSend);
 
-                        uint64_t tempPayload = 0;
-                        for (int f = 0; f < packet.length; f++)
+                        if ((packet.id & idMask.firstPacket) >>
+                            6)  // it is a first
+                                // packet of a data;
                         {
-                            uint64_t tempData = packet.data[f];
-                            tempPayload = tempPayload | (tempData << (f * 8));
+
+                            data[sourceId].len = leftToSend + 1;
+                            data[sourceId].canId =
+                                packet.id >> 7;  // discard the sequence number
                         }
+                        /*TRACE("len %d, nrec+1 %d, left to send %d\n",
+                              data[sourceId].len, (data[sourceId].nRec + 1),
+                              leftToSend);*/
+                        if ((data[sourceId].len - (data[sourceId].nRec + 1)) ==
+                            leftToSend)
+                        {
 
-                        data[sourceId]
-                            .payload[data[sourceId].len - leftToSend - 1] =
-                            tempPayload;
-                        data[sourceId].nRec++;
-                    }
+                            uint64_t tempPayload = 0;
+                            for (int f = 0; f < packet.length; f++)
+                            {
+                                uint64_t tempData = packet.data[f];
+                                tempPayload =
+                                    tempPayload | (tempData << (f * 8));
+                            }
+                            /*TRACE(
+                                "sourceID %d, Payload index %d, tempPayload "
+                                "%llu\n",
+                                sourceId, data[sourceId].len - leftToSend - 1,
+                                tempPayload);*/
+                            // check for index
+                            data[sourceId]
+                                .payload[data[sourceId].len - leftToSend - 1] =
+                                tempPayload;
+                            data[sourceId].nRec++;
+                        }
 
-                    if (data[sourceId].nRec == data[sourceId].len &&
-                        data[sourceId].nRec != 0)
-                    {
-                        mutex.lock();
-                        buffer.put(data[sourceId]);
-                        // empties the struct
-                        data[sourceId].canId = -1;
-                        data[sourceId].nRec  = 0;
-                        data[sourceId].len   = 0;
-                        mutex.unlock();
+                        if (data[sourceId].nRec == data[sourceId].len &&
+                            data[sourceId].nRec != 0)
+                        {
+                            miosix::Lock<miosix::FastMutex> l(mutex);
+                            buffer.put(data[sourceId]);
+                            // empties the struct
+                            data[sourceId].canId = -1;
+                            data[sourceId].nRec  = 0;
+                            data[sourceId].len   = 0;
+                        }
                     }
                 }
             }
diff --git a/src/shared/drivers/canbus/Canbus.h b/src/shared/drivers/canbus/Canbus.h
index 96a686b9206069d6fac893ef38efb5c643769acb..b841096f29ade3f3ec47fb8af18198709075e4bf 100644
--- a/src/shared/drivers/canbus/Canbus.h
+++ b/src/shared/drivers/canbus/Canbus.h
@@ -64,13 +64,13 @@ public:
         uint8_t awum     = 1;  // Automatic wakeup (1: automatic wakeup upon new
                                // message received)
         uint8_t nart =
-            0;  // No auto retransmission (0: packets are retrasmitted until
+            0;  // No auto retransmission (0: packets are retransmitted until
                 // success, 1: only one transfer attempt)
         uint8_t abom = 1;  // Automatic bus off management (1: automatically
                            // recovers from bus-off state)
         uint8_t rflm = 1;  // Receive fifo locked (0: new messages overwrite
                            // last ones, 1: new message discarded)
-        uint8_t txfp = 0;  // TX Fifo priority (0: identifier, 1: chronological)
+        uint8_t txfp = 1;  // TX Fifo priority (0: identifier, 1: chronological)
     };
 
     /**
diff --git a/src/tests/drivers/canbus/test-can-protocol.cpp b/src/tests/drivers/canbus/test-can-protocol.cpp
index db56f7da23dff69915954e9d896fd61718794590..9f8eef1ed68be96fccad479a789df19a701d2ba5 100644
--- a/src/tests/drivers/canbus/test-can-protocol.cpp
+++ b/src/tests/drivers/canbus/test-can-protocol.cpp
@@ -48,17 +48,23 @@ using CanRX = Gpio<GPIOA_BASE, 11>;
 using CanTX = Gpio<GPIOA_BASE, 12>;
 #endif
 
-#define SLP 5000
-
+#define SLP 100
+miosix::FastMutex mutex;
+CanData toSend1;
+CanData toSend2;
 void sendData(CanProtocol* protocol, CanData* toSend)
 {
     while (true)
     {
+
         TRACE("send\n");
-        (*protocol).sendCan(*toSend);
+        {
+            miosix::Lock<miosix::FastMutex> l(mutex);
+            (*protocol).sendCan(*toSend);
+        }
         Thread::sleep(SLP);
     }
-}  // todo mchange the source id and send packet at the same time
+}
 bool equal(CanData* first, CanData* second)
 {
     if ((*first).canId != (*second).canId || (*first).len != (*second).len)
@@ -97,11 +103,12 @@ int main()
     CanProtocol protocol(c);
     // Allow every message
     Mask32FilterBank f2(0, 0, 0, 0, 0, 0, 0);
+
     c->addFilter(f2);
     c->init();
     protocol.start();
-    CanData toSend1;
-    toSend1.canId      = 0x01;
+
+    toSend1.canId      = 0x200;
     toSend1.len        = 8;
     toSend1.payload[0] = 0xffffffffffffffff;
     toSend1.payload[1] = 2;
@@ -112,14 +119,15 @@ int main()
     toSend1.payload[6] = 12;
     toSend1.payload[7] = 0;
     std::thread firstSend(sendData, &protocol, &toSend1);
-    CanData toSend2;
+
+    Thread::sleep(10);
     toSend2.canId      = 0x100;
     toSend2.len        = 4;
     toSend2.payload[0] = 0xffffff;
     toSend2.payload[1] = 2;
     toSend2.payload[2] = 0x123ff;
     toSend2.payload[3] = 1;
-    // std::thread secondSend(sendData, &protocol, &toSend2);
+    std::thread secondSend(sendData, &protocol, &toSend2);
     TRACE("start \n");
     for (;;)
     {
@@ -127,20 +135,19 @@ int main()
         protocol.waitEmpty();
         CanData temp = protocol.getPacket();
         TRACE("received packet \n");
-        if (!equal(&temp, &toSend1))
+        if ((!equal(&temp, &toSend1) && !equal(&temp, &toSend2)))
         {
             TRACE("Error\n");
-            TRACE("Received  %lu, expected %lu\n", temp.canId, toSend1.canId);
-            TRACE("Received %d, expected %d\n", temp.len, toSend1.len);
+            TRACE("Received  %lu\n", temp.canId);
+            TRACE("Received %d\n", temp.len);
             for (int i = 0; i < temp.len; i++)
             {
-                TRACE("Received payload %d:  %llu, expected %llu\n", i,
-                      temp.payload[i], toSend1.payload[i]);
+                TRACE("Received payload %d:  %llu,\n", i, temp.payload[i]);
             }
         }
         else
         {
-            TRACE("OK :)\n");
+            TRACE("OK :) id  %lu\n", temp.canId);
         }
     }
 }