diff --git a/pkg/semtech-loramac/contrib/semtech_loramac.c b/pkg/semtech-loramac/contrib/semtech_loramac.c
index 4e6d0195c2fa4e07b29cec45024c224de4861892..0114d65576427789c3f6dbd72a488a1edcefa9ba 100644
--- a/pkg/semtech-loramac/contrib/semtech_loramac.c
+++ b/pkg/semtech-loramac/contrib/semtech_loramac.c
@@ -171,6 +171,11 @@ static void mcps_confirm(McpsConfirm_t *confirm)
                 break;
         }
     }
+    else {
+        msg_t msg;
+        msg.type = MSG_TYPE_LORAMAC_TX_CNF_FAILED;
+        msg_send(&msg, semtech_loramac_pid);
+    }
 }
 
 /* MCPS-Indication event function */
@@ -555,6 +560,14 @@ void *_semtech_loramac_event_loop(void *arg)
                     mac->state = SEMTECH_LORAMAC_STATE_IDLE;
                     break;
                 }
+                case MSG_TYPE_LORAMAC_TX_CNF_FAILED:
+                    DEBUG("[semtech-loramac] loramac TX failed\n");
+                    msg_t msg_ret;
+                    msg_ret.type = MSG_TYPE_LORAMAC_TX_CNF_FAILED;
+                    msg_send(&msg_ret, mac->caller_pid);
+                    /* switch back to idle state now*/
+                    mac->state = SEMTECH_LORAMAC_STATE_IDLE;
+                    break;
                 case MSG_TYPE_LORAMAC_RX:
                 {
                     msg_t msg_ret;
@@ -678,10 +691,18 @@ uint8_t semtech_loramac_recv(semtech_loramac_t *mac)
     /* Wait until the mac receive some information */
     msg_t msg;
     msg_receive(&msg);
-    uint8_t ret = SEMTECH_LORAMAC_TX_DONE;
-    if (msg.type == MSG_TYPE_LORAMAC_RX) {
-        ret = SEMTECH_LORAMAC_DATA_RECEIVED;
-    }
+    uint8_t ret;
+    switch (msg.type) {
+        case MSG_TYPE_LORAMAC_RX:
+            ret = SEMTECH_LORAMAC_DATA_RECEIVED;
+            break;
+        case MSG_TYPE_LORAMAC_TX_CNF_FAILED:
+            ret = SEMTECH_LORAMAC_TX_CNF_FAILED;
+            break;
+        default:
+            ret = SEMTECH_LORAMAC_TX_DONE;
+            break;
+     }
 
     DEBUG("[semtech-loramac] MAC reply received: %d\n", ret);
 
diff --git a/pkg/semtech-loramac/include/semtech_loramac.h b/pkg/semtech-loramac/include/semtech_loramac.h
index 065ddd0a2c898b3b5e2cec99e6923296ea11d68d..c0e07750cf9961b97ce3bdda8994ee177f0b7b7a 100644
--- a/pkg/semtech-loramac/include/semtech_loramac.h
+++ b/pkg/semtech-loramac/include/semtech_loramac.h
@@ -45,6 +45,7 @@ extern "C" {
 #define MSG_TYPE_LORAMAC_TX_DONE       (0x3462)  /**< MAC TX completes */
 #define MSG_TYPE_LORAMAC_RX            (0x3463)  /**< Some data received */
 #define MSG_TYPE_LORAMAC_LINK_CHECK    (0x3464)  /**< Link check info received */
+#define MSG_TYPE_LORAMAC_TX_CNF_FAILED (0x3465)  /**< MAC TX confirmed failed */
 /** @} */
 
 /**
@@ -61,6 +62,7 @@ enum {
     SEMTECH_LORAMAC_NOT_JOINED,                  /**< MAC is not joined */
     SEMTECH_LORAMAC_TX_SCHEDULED,                /**< TX data scheduled */
     SEMTECH_LORAMAC_TX_DONE,                     /**< Transmission completed */
+    SEMTECH_LORAMAC_TX_CNF_FAILED,               /**< Confirmable transmission failed */
     SEMTECH_LORAMAC_DATA_RECEIVED,               /**< Data received */
     SEMTECH_LORAMAC_BUSY                         /**< Internal MAC is busy */
 };
diff --git a/tests/pkg_semtech-loramac/main.c b/tests/pkg_semtech-loramac/main.c
index 0d19cf4e5f1ba90aadf7f58af4567cfe6d06f041..a107aca2c4605346acff86e6f19a1b5a9942e6be 100644
--- a/tests/pkg_semtech-loramac/main.c
+++ b/tests/pkg_semtech-loramac/main.c
@@ -411,6 +411,10 @@ static int _cmd_loramac(int argc, char **argv)
                        (char *)loramac.rx_data.payload, loramac.rx_data.port);
                 break;
 
+            case SEMTECH_LORAMAC_TX_CNF_FAILED:
+                puts("Confirmable TX failed");
+                break;
+
             case SEMTECH_LORAMAC_TX_DONE:
                 puts("TX complete, no data received");
                 break;