diff --git a/master/datagram.c b/master/datagram.c
index 381d74276ec32fa98e1c3006c800391615994a1e..59d2376ad515964d2ccd0db69e474bfd9c12d54d 100644
--- a/master/datagram.c
+++ b/master/datagram.c
@@ -299,3 +299,23 @@ int ec_datagram_lrw(ec_datagram_t *datagram,
 }
 
 /*****************************************************************************/
+
+/**
+ * Evaluates the working counter of a single-cast datagram.
+ * Outputs an error message.
+ */
+
+void ec_datagram_print_wc_error(
+        const ec_datagram_t *datagram
+        )
+{
+    if (datagram->working_counter == 0)
+        printk("No response.");
+    else if (datagram->working_counter > 1)
+        printk("%u slaves responded!", datagram->working_counter);
+    else
+        printk("Success.");
+    printk("\n");
+}
+
+/*****************************************************************************/
diff --git a/master/datagram.h b/master/datagram.h
index 36e03d5dc08fa18c640b6b53c0c557c80165bcba..a35af77f73eeaf7f2e60806412c08c73bfe84cfe 100644
--- a/master/datagram.h
+++ b/master/datagram.h
@@ -121,6 +121,8 @@ int ec_datagram_brd(ec_datagram_t *, uint16_t, size_t);
 int ec_datagram_bwr(ec_datagram_t *, uint16_t, size_t);
 int ec_datagram_lrw(ec_datagram_t *, uint32_t, size_t);
 
+void ec_datagram_print_wc_error(const ec_datagram_t *);
+
 /*****************************************************************************/
 
 #endif
diff --git a/master/fsm_change.c b/master/fsm_change.c
index e39158e0e28e265a809d10fb36f1d259a6cbb3e8..648e443fade3e86a079e414ae2f3c48c66d7b7a1 100644
--- a/master/fsm_change.c
+++ b/master/fsm_change.c
@@ -190,13 +190,14 @@ void ec_fsm_change_state_check(ec_fsm_change_t *fsm
         fsm->jiffies_start = datagram->jiffies_sent;
     }
 
-    if (datagram->working_counter != 1) {
+    if (datagram->working_counter == 0) {
         if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) {
             char state_str[EC_STATE_STRING_SIZE];
             ec_state_string(fsm->requested_state, state_str);
             fsm->state = ec_fsm_change_state_error;
-            EC_ERR("Failed to set state %s on slave %i: Slave did not"
-                   " respond.\n", state_str, fsm->slave->ring_position);
+            EC_ERR("Failed to set state %s on slave %i: ",
+                    state_str, fsm->slave->ring_position);
+            ec_datagram_print_wc_error(datagram);
             return;
         }
 
@@ -207,6 +208,16 @@ void ec_fsm_change_state_check(ec_fsm_change_t *fsm
         return;
     }
 
+    if (unlikely(datagram->working_counter > 1)) {
+        char state_str[EC_STATE_STRING_SIZE];
+        ec_state_string(fsm->requested_state, state_str);
+        fsm->state = ec_fsm_change_state_error;
+        EC_ERR("Failed to set state %s on slave %i: ",
+                state_str, fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
+        return;
+    }
+
     fsm->take_time = 1;
 
     // read AL status from slave
@@ -242,8 +253,9 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
         char req_state[EC_STATE_STRING_SIZE];
         ec_state_string(fsm->requested_state, req_state);
         fsm->state = ec_fsm_change_state_error;
-        EC_ERR("Failed to check state %s on slave %i.\n",
+        EC_ERR("Failed to check state %s on slave %i: ",
                req_state, slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -372,7 +384,8 @@ void ec_fsm_change_state_code(ec_fsm_change_t *fsm
     }
 
     if (datagram->working_counter != 1) {
-        EC_WARN("Reception of AL status code datagram failed.\n");
+        EC_WARN("Reception of AL status code datagram failed: ");
+        ec_datagram_print_wc_error(datagram);
     }
     else {
         if ((code = EC_READ_U16(datagram->data))) {
@@ -433,8 +446,9 @@ void ec_fsm_change_state_ack(ec_fsm_change_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_change_state_error;
-        EC_ERR("Reception of state ack datagram failed - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Reception of state ack datagram failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -471,8 +485,9 @@ void ec_fsm_change_state_check_ack(ec_fsm_change_t *fsm
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_change_state_error;
-        EC_ERR("Reception of state ack check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of state ack check datagram failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
diff --git a/master/fsm_coe.c b/master/fsm_coe.c
index fa522d42a2a42952a19a85a99608f415b0b30c1b..fdb800f0f9e6a83c433e19b2ac8580efd39f7a04 100644
--- a/master/fsm_coe.c
+++ b/master/fsm_coe.c
@@ -289,8 +289,9 @@ void ec_fsm_coe_dict_request(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE dictionary request failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE dictionary request failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -325,9 +326,9 @@ void ec_fsm_coe_dict_check(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n",
+        EC_ERR("Reception of CoE mailbox check datagram failed on slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -381,8 +382,9 @@ void ec_fsm_coe_dict_response(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE dictionary response failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE dictionary response failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -506,8 +508,9 @@ void ec_fsm_coe_dict_desc_request(ec_fsm_coe_t *fsm /**< finite state machine */
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE SDO description request failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE SDO description"
+                " request failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -542,8 +545,9 @@ void ec_fsm_coe_dict_desc_check(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE mailbox check"
+                " datagram failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -596,8 +600,9 @@ void ec_fsm_coe_dict_desc_response(ec_fsm_coe_t *fsm
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE SDO description response failed - slave %i"
-               " did not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE SDO description"
+                " response failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -709,8 +714,9 @@ void ec_fsm_coe_dict_entry_request(ec_fsm_coe_t *fsm
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE SDO entry request failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE SDO entry request failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -746,8 +752,9 @@ void ec_fsm_coe_dict_entry_check(ec_fsm_coe_t *fsm
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE mailbox check"
+                " datagram failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -801,8 +808,9 @@ void ec_fsm_coe_dict_entry_response(ec_fsm_coe_t *fsm
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE SDO description response failed - slave %i"
-               " did not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE SDO description"
+                " response failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -991,8 +999,9 @@ void ec_fsm_coe_down_request(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE download request failed - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE download request failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1027,8 +1036,9 @@ void ec_fsm_coe_down_check(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE mailbox check"
+                " datagram failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1080,8 +1090,9 @@ void ec_fsm_coe_down_response(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE download response failed - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE download response failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1200,8 +1211,9 @@ void ec_fsm_coe_up_request(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE upload request failed - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE upload request failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1236,8 +1248,9 @@ void ec_fsm_coe_up_check(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE mailbox check"
+                " datagram failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1294,8 +1307,9 @@ void ec_fsm_coe_up_response(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE upload response failed - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE upload response failed on slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1439,8 +1453,9 @@ void ec_fsm_coe_up_seg_request(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE upload segment request failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE upload segment"
+                " request failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1475,8 +1490,9 @@ void ec_fsm_coe_up_seg_check(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed - slave %i did"
-               " not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE mailbox check"
+                " datagram failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1533,8 +1549,9 @@ void ec_fsm_coe_up_seg_response(ec_fsm_coe_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_coe_error;
-        EC_ERR("Reception of CoE upload segment response failed - slave %i"
-               " did not respond.\n", slave->ring_position);
+        EC_ERR("Reception of CoE upload segment"
+                " response failed on slave %i: ", slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
diff --git a/master/fsm_master.c b/master/fsm_master.c
index 4fd3f61de005fbf0b51ffb8abed543c91c332c5f..ef72d8f77b2476dacbe3167b3183dfb0d3f1294f 100644
--- a/master/fsm_master.c
+++ b/master/fsm_master.c
@@ -587,18 +587,21 @@ void ec_fsm_master_state_read_states(ec_fsm_master_t *fsm /**< master state mach
 
     if (datagram->state != EC_DATAGRAM_RECEIVED) {
         EC_ERR("Failed to receive AL state datagram for slave %i"
-                " (datagram state %i)\n", slave->ring_position, datagram->state);
+                " (datagram state %i)\n",
+                slave->ring_position, datagram->state);
         fsm->state = ec_fsm_master_state_error;
         return;
     }
 
     // did the slave not respond to its station address?
-    if (datagram->working_counter != 1) {
+    if (datagram->working_counter == 0) {
         ec_slave_set_online_state(slave, EC_SLAVE_OFFLINE);
         ec_fsm_master_action_next_slave_state(fsm);
         return;
     }
 
+    // FIXME what to to on multiple response?
+
     // slave responded
     ec_slave_set_state(slave, EC_READ_U8(datagram->data)); // set app state first
     ec_slave_set_online_state(slave, EC_SLAVE_ONLINE);
@@ -774,8 +777,9 @@ void ec_fsm_master_state_rewrite_addresses(ec_fsm_master_t *fsm
     }
 
     if (datagram->working_counter != 1) {
-        EC_ERR("Failed to write station address - slave %i did not respond.\n",
+        EC_ERR("Failed to write station address of slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         fsm->state = ec_fsm_master_state_error;
         return;
     }
diff --git a/master/fsm_sii.c b/master/fsm_sii.c
index 0e3043f671438af525c97b8bd7405ef2d5d17bde..abaf24158e6979a3a894e9bb9be9dabc07397a0d 100644
--- a/master/fsm_sii.c
+++ b/master/fsm_sii.c
@@ -196,8 +196,9 @@ void ec_fsm_sii_read_check(ec_fsm_sii_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_sii_error;
-        EC_ERR("Reception of SII read datagram failed - slave %i did not"
-               " respond.\n", fsm->slave->ring_position);
+        EC_ERR("Reception of SII read datagram failed on slave %i: ",
+                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -242,8 +243,9 @@ void ec_fsm_sii_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_sii_error;
-        EC_ERR("Reception of SII check/fetch datagram failed - slave %i did"
-               " not respond\n", fsm->slave->ring_position);
+        EC_ERR("Reception of SII check/fetch datagram failed on slave %i: ",
+                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -338,8 +340,9 @@ void ec_fsm_sii_write_check(ec_fsm_sii_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_sii_error;
-        EC_ERR("Reception of SII write datagram failed - slave %i did not"
-               " respond.\n", fsm->slave->ring_position);
+        EC_ERR("Reception of SII write datagram failed on slave %i: ",
+                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -375,8 +378,9 @@ void ec_fsm_sii_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */)
 
     if (datagram->working_counter != 1) {
         fsm->state = ec_fsm_sii_error;
-        EC_ERR("Reception of SII write check datagram failed - slave %i did"
-               " not respond.\n", fsm->slave->ring_position);
+        EC_ERR("Reception of SII write check datagram failed on slave %i: ",
+                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
diff --git a/master/fsm_slave.c b/master/fsm_slave.c
index 5c4fccc2798870f58a415fc34f332035720e2f88..3f049a66526d624f914bc73ab588d14b2f22de96 100644
--- a/master/fsm_slave.c
+++ b/master/fsm_slave.c
@@ -226,8 +226,9 @@ void ec_fsm_slave_scan_state_address(ec_fsm_slave_t *fsm /**< slave state machin
     if (datagram->working_counter != 1) {
         fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to write station address - slave %i did not respond.\n",
+        EC_ERR("Failed to write station address on slave %i: ",
                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -243,7 +244,9 @@ void ec_fsm_slave_scan_state_address(ec_fsm_slave_t *fsm /**< slave state machin
    Slave scan state: STATE.
 */
 
-void ec_fsm_slave_scan_state_state(ec_fsm_slave_t *fsm /**< slave state machine */)
+void ec_fsm_slave_scan_state_state(
+        ec_fsm_slave_t *fsm /**< slave state machine */
+        )
 {
     ec_datagram_t *datagram = fsm->datagram;
     ec_slave_t *slave = fsm->slave;
@@ -262,8 +265,9 @@ void ec_fsm_slave_scan_state_state(ec_fsm_slave_t *fsm /**< slave state machine
     if (datagram->working_counter != 1) {
         fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to read AL state - slave %i did not respond.\n",
+        EC_ERR("Failed to read AL state of slave %i: ",
                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -306,8 +310,9 @@ void ec_fsm_slave_scan_state_base(ec_fsm_slave_t *fsm /**< slave state machine *
     if (datagram->working_counter != 1) {
         fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to read base data - slave %i did not respond.\n",
+        EC_ERR("Failed to read base data from slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -352,8 +357,9 @@ void ec_fsm_slave_scan_state_datalink(ec_fsm_slave_t *fsm /**< slave state machi
     if (datagram->working_counter != 1) {
         fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to read DL status - slave %i did not respond.\n",
+        EC_ERR("Failed to read DL status from slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -644,8 +650,9 @@ void ec_fsm_slave_conf_state_clear_fmmus(ec_fsm_slave_t *fsm
     if (datagram->working_counter != 1) {
         fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to clear FMMUs - slave %i did not respond.\n",
+        EC_ERR("Failed to clear FMMUs of slave %i: ",
                fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -726,8 +733,9 @@ void ec_fsm_slave_conf_state_mbox_sync(ec_fsm_slave_t *fsm /**< slave state mach
     if (datagram->working_counter != 1) {
         slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to set sync managers - slave %i did not respond.\n",
+        EC_ERR("Failed to set sync managers of slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -941,8 +949,9 @@ void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *fsm /**< slave state machi
     if (datagram->working_counter != 1) {
         slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to set process data sync managers - slave %i did not"
-               " respond.\n", slave->ring_position);
+        EC_ERR("Failed to set process data sync managers of slave %i: ",
+                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }
 
@@ -1002,8 +1011,9 @@ void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *fsm /**< slave state machine *
     if (datagram->working_counter != 1) {
         slave->error_flag = 1;
         fsm->state = ec_fsm_slave_state_error;
-        EC_ERR("Failed to set FMMUs - slave %i did not respond.\n",
+        EC_ERR("Failed to set FMMUs of slave %i: ",
                slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
         return;
     }