diff --git a/sbs.conf b/sbs.conf
index ab0c9ccba8cf67682274e7c0621458f382054ec2..48ad7550a9bb69c2f55665362bb184f56c75599c 100644
--- a/sbs.conf
+++ b/sbs.conf
@@ -328,6 +328,14 @@ Include:    %shared %canbus
 Defines:    -DDEBUG
 Main:       test-canproxy
 
+[test-canproxy-slave]
+Type:       test
+BoardId:    stm32f103cb_skyward_strain_board
+BinName:    test-canproxy
+Include:    %shared %canbus
+Defines:    -DDEBUG -DIS_SLAVE
+Main:       test-canproxy
+
 [test-logproxy]
 Type:       test
 BoardId:    stm32f429zi_skyward_death_stack
diff --git a/src/boards/StrainBoard/StrainBoard.h b/src/boards/StrainBoard/StrainBoard.h
index 46d1242c76bfc0c1245472089d197289fa092b22..5dd91345754fb94f61039cf046a71397cc93a398 100644
--- a/src/boards/StrainBoard/StrainBoard.h
+++ b/src/boards/StrainBoard/StrainBoard.h
@@ -49,13 +49,11 @@ public:
         // Setup CAN
         can_proxy.addHandler(this);
 
-        canbus_init_t init =
-            canbus_init_t{CAN1,
-                          miosix::Mode::ALTERNATE,
-                          0,
-                          {USB_LP_CAN1_RX0_IRQn, CAN1_RX1_IRQn}};
+        CanConfig config = {
+            CAN1, CanTimings::forTqBaud(12, 50000), {USB_LP_CAN1_RX0_IRQn, CAN1_RX1_IRQn}
+        };
 
-        can_proxy.setupBus<GPIOA_BASE, 11, 12>(init, 0);
+        can_proxy.setupBus(config, 0);
 
         // Init ADC
         adc.init();
@@ -90,7 +88,17 @@ private:
                 sendHeartbeat();
                 break;
 
-                // TODO: Missing states
+            // TODO(events): Actual events
+            case 69:
+                adc.setChannel(ADCAdapter::Channel::PRIMARY);
+                sampler.sampleBulk();
+                break;
+            
+            // TODO(events): Actual events
+            case 42:
+                adc.setChannel(ADCAdapter::Channel::SECONDARY);
+                sampler.sampleBulk();
+                break;
         }
     }
 
diff --git a/src/boards/shared/canbus/CanProxy.h b/src/boards/shared/canbus/CanProxy.h
index 04baa9eb02249c1f22032f76dba3266b7f14d2ec..d0d049336b874d43f88071fc325f9e6c2ba632c5 100644
--- a/src/boards/shared/canbus/CanProxy.h
+++ b/src/boards/shared/canbus/CanProxy.h
@@ -95,14 +95,13 @@ public:
     /// an heap allocated instance if this cannot be guaranteed!
     ///
     /// @param can_id The id of the configured CAN bus in CanManager.
-    template <uint32_t gpio, uint8_t rx, uint8_t tx>
-    void setupBus(const canbus_init_t &i, uint32_t can_id)
+    void setupBus(const CanConfig &config, uint32_t can_id)
     {
 #ifdef DEBUG
         assert(bus == NULL && "setupBus already called!");
 #endif
 
-        mgr->addBus<gpio, rx, tx>(i, [=](CanMsg can_msg, CanStatus status) {
+        mgr->addBus(config, [=](CanMsg can_msg, CanStatus status) {
             this->canDispatcher(can_msg, status);
         });
 
diff --git a/src/tests/strainboard/test-all-strainboard-master.cpp b/src/tests/strainboard/test-all-strainboard-master.cpp
index f0a4a9b5200ec26ba518ede64577235bad6c4e68..ae9c0b6b6a9148b97b2dad928923f75808c18517 100644
--- a/src/tests/strainboard/test-all-strainboard-master.cpp
+++ b/src/tests/strainboard/test-all-strainboard-master.cpp
@@ -82,7 +82,8 @@ int menu()
     printf("--------------------\n");
     printf("Insert a number:\n");
     printf("1 - Request heartbeat\n");
-    // TODO: Missing states
+    printf("2 - Request sample primary\n");
+    printf("3 - Request sample secondary\n");
     printf("\n");
     printf(">> ");
 
@@ -105,12 +106,12 @@ int main()
     CanHandler handler;
     can_proxy.addHandler(&handler);
 
-    canbus_init_t init = canbus_init_t{CAN1,
-                                       miosix::Mode::ALTERNATE,
-                                       9,
-                                       {CAN1_RX0_IRQn, CAN1_RX1_IRQn}};
+    // FIXME: TimerUtils returns wrong prescaler for CAN, beware!!!
+    CanConfig config = {
+        CAN1, CanTimings::forTqBaud(12, 50000), {CAN1_RX0_IRQn, CAN1_RX1_IRQn}
+    };
 
-    can_proxy.setupBus<GPIOA_BASE, 11, 12>(init, 0);
+    can_proxy.setupBus(config, 0);
     printf("CANBUS successfully initialized!\n");
 
     while (true)
@@ -122,6 +123,20 @@ int main()
                                     EV_SEND_HEARTBEAT,
                                     CanProxy::getTs(), NULL, 0);
                 break;
+
+            case 2:
+                // TODO(events): Actual events
+                can_proxy.sendEvent(CanProxy::Topic::STRAIN_BOARD,
+                                    69,
+                                    CanProxy::getTs(), NULL, 0);
+                break;
+
+            case 3:
+                // TODO(events): Actual events
+                can_proxy.sendEvent(CanProxy::Topic::STRAIN_BOARD,
+                                    42,
+                                    CanProxy::getTs(), NULL, 0);
+                break;
         }
     }
 
diff --git a/src/tests/test-canproxy.cpp b/src/tests/test-canproxy.cpp
index 7ab7d598be6161376d22beb3e734151d1abc9790..d57b24963c0cdfc33225a64038d09a74fed9d9db 100644
--- a/src/tests/test-canproxy.cpp
+++ b/src/tests/test-canproxy.cpp
@@ -25,6 +25,8 @@
 
 using namespace miosix;
 
+extern int invoked = 0;
+
 // Uncomment this line to compile for the other side (aka the "slave")
 // #define IS_SLAVE
 
@@ -47,29 +49,41 @@ int main() {
         }
     };
 
+    TRACE("self: %d\n", self);
+    TRACE("other: %d\n", other);
+
+    TRACE("ABP1: %d\n", TimerUtils::getPrescalerInputFrequency(TimerUtils::InputClock::APB1));
     CanHandler handler;
 
     TRACE("Setting up canbus...\n");
-    canbus_init_t st = {
-        CAN1, Mode::ALTERNATE, 9, {CAN1_RX0_IRQn, CAN1_RX1_IRQn}
+#ifdef _ARCH_CORTEXM3_STM32
+    CanConfig st = {
+        CAN1, CanTimings::forTqBaud(12, 50000), {USB_LP_CAN1_RX0_IRQn, CAN1_RX1_IRQn}
+    };
+#else
+    CanConfig st = {
+        CAN1, CanTimings::forTqBaud(12, 100000), {CAN1_RX0_IRQn, CAN1_RX1_IRQn}
     };
+#endif
 
     CanManager mgr(CAN1);
 
     CanProxy can(&mgr, self);
-    can.setupBus<GPIOA_BASE, 11, 12>(st, 0);
+    can.setupBus(st, 0);
 
     can.addHandler(&handler);
     TRACE("Setup finished...\n");
 
     while(1) {
+        int bits = 0b01010101010101010101010101010101;
+
         TRACE("Sending data...\n");
         can.sendEvent(
             other, 
             10,
             CanProxy::getTs(),
-            NULL,
-            0
+            (void*)&bits,
+            4
         );
 
         Thread::sleep(1000);